LVGL8.3 --lv_img 图像

一、Img 简介

1.1 Overview(概述)

图像是在flash中(以数组形式)或外部以文件形式显示图像的基本对象。图像也可以显示符号(LV_SYMBOL_…)。
使用图像解码器接口,还可以支持自定义图像格式。

1.2 Parts and Styles(部分和风格)

  • LV_PART_MAIN :使用典型背景样式属性的背景矩形和使用图像样式属性的图像本身。

注:通常设置图像只会看到图像本身,是因为这里的矩形背景OPA默认是0,也就是完全透明。

二、Img 使用

2.1 Image source(图片来源)

为了提供最大的灵活性,图像的来源可以是:

  • 代码中的变量(带有像素的 C 数组)。
  • 外部存储的文件(例如在 SD 卡上)。
  • 带有 Symbols 的文本。
/*img 控件设置图片*/
void lv_img_set_src(lv_obj_t* obj, const void* src);

2.1.1 C数组

  1. 要从 PNG、JPG 或 BMP 图像生成像素数组,请使用 在线图像转换工具得到一个.c 文件并使用其指针设置转换后的图像。
  2. 需要使用 LV_IMG_DECLARE(converted_img_var) 声明它。
  3. 调用函数 lv_img_set_src(img1, &converted_img_var )。

2.1.2 外部存储文件

  1. 要使用外部文件,需要使用在线转换器工具转换图像文件,选择二进制输出格式。
  2. 需要使用 LVGL 的文件系统模块,并为基本文件操作注册一个具有一些功能的驱动程序。
  3. 要设置来自文件的图像,使用lv_img_set_src(img, “S:folder1/my_img.bin”)。

2.1.3 Symbols文本

还可以设置类似于 标签 的符号。 在这种情况下,图像将根据样式中指定的 font 呈现为文本。 它允许使用轻量级单色“字母”而不是真实图像。 你可以设置像lv_img_set_src(img1, LV_SYMBOL_OK)这样的符号。

2.2 Recolor(重新着色)

颜色可以与具有给定强度的图像的每个像素混合。 这对于显示图像的不同状态(选中、非活动、按下等)非常有用,而无需存储同一图像的更多版本。
可以通过在“LV_OPA_TRANSP”(无重新着色,值:0)和“LV_OPA_COVER”(完全重新着色,值:255)之间设置“img_recolor_opa”在样式中启用此功能。 默认值为“LV_OPA_TRANSP”,因此禁用此功能。要混合的颜色由 “img_recolor” 设置。
注:img_recolor_opa和img_recolor要搭配使用。

2.3 Transformations(转换)

LVGL中一般设置控件对象大小采用lv_obj_set_size(obj,w,h); 对于Img在不设置其大小时候,控件大小会自适应LV_SIZE_CONTENT 所设置图片的大小,但是一旦设置了size,控件大小会受所设置的size限制,若控件size < 图片size,则超出控件部分会被截取;若控件size > 图片size,控件内空间会被所设置的图片排列填充。
在默认情况下,设置图片时图像对象的高度和宽度都是自适应锁设置的图片的高度和宽度,但在其他场景下,LVGL提供了一些设置图像转换的接口实现对应效果。

2.3.1 偏移

您可以为显示的图像添加一些偏移量,在图像对象的坐标为原点设置其偏移量。 如果对象大小小于图像源大小,则很有用。 使用偏移参数 Texture atlas 或“运行图像”效果可以通过 Animating x 或 y 偏移创建。

void lv_img_set_offset_x(lv_obj_t* obj, lv_coord_t x);
void lv_img_set_offset_y(lv_obj_t* obj, lv_coord_t y);

2.3.2 缩放

  • 将 zoom设置为 256 或 LV_IMG_ZOOM_NONE 以禁用缩放。
  • 较大的值会放大图像(例如“512”双倍尺寸),较小的值会缩小图像(例如“128”半尺寸)。
  • 分数尺度也有效。 例如。 281 放大 10%。
/**
 * @example 256 or LV_ZOOM_IMG_NONE for no zoom
 * @example <256: scale down
 * @example >256 scale up
 * @example 128 half size
 * @example 512 double size
 */
void lv_img_set_zoom(lv_obj_t* obj, uint16_t zoom);

2.3.3 旋转

要旋转图像,请使用 lv_img_set_angle(img, angle)。 角度的精度为 0.1 度,因此对于 45.8° 设置 458。transform_zoom 和 transform_angle 样式属性也用于确定最终的缩放和角度。
默认情况下,旋转的轴心点是图像的中心。 它可以通过 lv_img_set_pivot(img, pivot_x, pivot_y) 改变。(0,0)是左上角。

三、Img API

lv_obj_t * lv_img_create(lv_obj_t * parent);							//创建一个图像对象

void lv_img_set_src(lv_obj_t * obj, const void * src);					//设置图像数据显示在对象上
void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x);					//设置图像源的偏移量,这样图像将从新的原点显示。
void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y);					//设置图像源的偏移量。
void lv_img_set_angle(lv_obj_t * obj, int16_t angle);					//设置图像的旋转角度。
void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);		//设置图像的旋转中心。
void lv_img_set_zoom(lv_obj_t * obj, uint16_t zoom);					//设置图像的缩放系数。
void lv_img_set_antialias(lv_obj_t * obj, bool antialias);				//启用/禁用抗锯齿的转换(旋转,缩放)或不。
void lv_img_set_size_mode(lv_obj_t * obj, lv_img_size_mode_t mode);		//设置图像对象大小模式。

const void * lv_img_get_src(lv_obj_t * obj);							//获取图像的来源
lv_coord_t lv_img_get_offset_x(lv_obj_t * obj);							//获取图像对象的偏移量x属性。
lv_coord_t lv_img_get_offset_y(lv_obj_t * obj);							//获取图像对象的偏移量y属性。
uint16_t lv_img_get_angle(lv_obj_t * obj);								//获取图像的旋转角度。
void lv_img_get_pivot(lv_obj_t * obj, lv_point_t * pivot);				//获取图像的轴心(旋转中心)。
uint16_t lv_img_get_zoom(lv_obj_t * obj);								//获取图像的缩放因子。
bool lv_img_get_antialias(lv_obj_t * obj);								//获取转换(旋转,缩放)是否抗锯齿
lv_img_size_mode_t lv_img_get_size_mode(lv_obj_t * obj);				//获取图像的大小模式
LVGL(LittlevGL)是一个用于嵌入式系统的开源图形库,它主要用于构建用户界面。如果你想在LVGL 8.3中将两个图片对象叠加显示,你可以按照以下步骤创建并操作它们: ```c #include "lvgl.h" // 引入LVGL头文件 // 初始化LVGL void lv_init() { if (lv.init() != LV_OK) { // 初始化失败处理 return; } } // 创建图像对象 LV_IMG_DSC img1_dsc = {0}; img1_dsc.data = LV_IMAGE décid1_data; // 图片1的数据,这里假设已加载到决定data变量 LV_IMG_DEF(img1_def, &img1_dsc); // 定义第一个图像对象 LV_IMG_DSC img2_dsc = {0}; img2_dsc.data = LV_IMAGE décid2_data; // 图片2的数据 LV_IMG_DEF(img2_def, &img2_dsc); // 定义第二个图像对象 // 创建一个大图区域用于显示叠加 LV_OBJ *main_area = lv_obj_create(lv_scr_act(), NULL); lv_obj_set_size(main_area, LV_HOR_RES, LV_VER_RES); // 创建第一个图片对象并设置位置 LV_IMG *img1 = lv_img_create(main_area, NULL, &img1_def); lv_obj_set_pos(img1, 0, 0); // 图片1位于左上角 // 创建第二个图片对象,调整大小和位置覆盖第一个图片 LV_IMG *img2 = lv_img_create(main_area, NULL, &img2_def); lv_obj_set_pos(img2, 50, 50); // 图片2从第二个图片的中心开始,大小可能需要调整使其完全覆盖第一个图片 lv_obj_set_size(img2, lv_obj_get_width(img1) - 100, lv_obj_get_height(img1) - 100); // 减去一定的边距避免重叠 // 显示图片 lv_obj_flush(main_area); // 刷新屏幕显示更新后的图像 } int main(void) { lv_init(); lv_task_handler(); // 进行主任务循环 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值