实现图像缩放控制器
本章节将介绍如何实现图像缩放控制器,它主要为图像查看界面提供缩放状态管理和可见区域控制能力。完成本章后你将学会:
- 根据缩放焦点计算缩放后的可见区域位置,并限制它的移动范围
- 使用 LCUI 库加载图像信息
数据结构
缩放比例的计算依赖图像的尺寸、可见区域的尺寸。缩放时需要做最小比例限制以避免过度缩小,这个比例应是图像在可见区域内完整显示的最大比例,简称“自 适应比例”。
在缩放和移动可见区域时,需要基于当前的位置和焦点位置来计算新的位置。其中的焦点默认在可见区域中心,它的作用是在使用鼠标滚轮缩放时以鼠标指针位置为中心进行缩放,这样指针在缩放前后始终指向同一处。
结合上述需求,我们可以得出以下数据结构定义:
src/image-controller.h
#ifndef IMAGE_CONTROLLER_H
#define IMAGE_CONTROLLER_H
#include <ui.h>
typedef struct image_controller {
float scale;
float focus_x, focus_y;
float viewport_width, viewport_height;
float image_offset_x, image_offset_y;
ui_image_t *image;
} image_controller_t;
#endif
这些成员的说明如下:
scale
是当前缩放比例,min_scale
是最 小缩放比例。viewport_width
和viewport_height
是可见区域的宽高。image_offset_x
和image_offset_y
是图像左上角相对于可见区域左上角的位置。在图像放大超出可见区域后,值会小于等于 0。在图像缩小至可见区域内后,值都大于或等于 0。focus_x
和focus_y
是缩放焦点相对于图像左上角的位置,值都大于 0。ui_image_t
类型的 image 包含图像尺寸信息,它是 ui.h 头文件提供的数据结构,除此之外,该头文件还提供一系列图像加载相关的函数。
初始化
定义初始化函数,给结构体成员赋初始值,避免计算出错。
src/image-controller.c
#include "image-controller.h"
void image_controller_init(image_controller_t *c)
{
c->scale = 1.f;
c->image = NULL;
c->image_offset_x = 0;
c->image_offset_y = 0;
c->focus_x = 0;
c->focus_y = 0;
c->viewport_width = 0;
c->viewport_height = 0;
}
src/image-controller.h
void image_controller_init(image_controller_t *c);
销毁
定义销毁函数。需要销毁的只有 image,它由下文的文件加载函数创建。
src/image-controller.c
void image_controller_destroy(image_controller_t *c)
{
if (c->image) {
ui_image_destroy(c->image);
}
c->image = NULL;
}
src/image-controller.h
void image_controller_destroy(image_controller_t *c);