嵌入式ui——lvgl显示图片

 在使用lvgl显示图片有两种方式,一种是使用文件系统显示,这种显示方式灵活,而且对cpu的占用资源也少。第二种是使用c数组的形式访问,这种占用资源比较大因此,图片不可以太大。尽量小,要不然堆栈会溢出。

 一、使用c数组显示图片

1.1在lvgl官网中导入图片转换成.c文件    

https://lvgl.io/tools/imageconverter //官网网址

1.2生成c文件

1.3将c文件导入工程中

1.4添加声明代码

LV_IMG_DECLARE(your_img);//此处输入c文件名字

1.5显示图片

 lv_obj_t *img = lv_img_create(obj);  // 在 obj 上创建图像对象
 lv_img_set_src(img, &your_img);  // 设置图像源
 lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);  // 图像居中显示

二、直接使用文件系统显示图片

2.1 挂载文件系统

这里使用的是posix,在lv_conf文件中找到

 LV_USE_FS_POSIX 0改为 LV_USE_FS_POSIX 1

LV_FS_POSIX_LETTER ’ ‘改为LV_FS_POSIX_LETTER ’P‘

后面两个分别为路径和缓冲区,可以不用设置。

2.2 启用解码器

这里启用了PNG解码器,在lv_conf中可以找到

启动解码器之后,记得在lvgl初始化的时候,同样对解码器进行初始化

lv_png_init();

2.3 显示图片

lv_obj_t *img = lv_img_create(left_obj);
lv_img_set_src(img, "P:/your/img"); // 替换为你的图片路径
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); // 图片居中对齐

文件路径开头,要以之前挂载文件系统时输的字母相同。

LV_FS_POSIX_LETTER ’P‘

所以,在这里我的路径为 P:/your/img

三、FAQ

 图片部分显示”No data“

1,若是使用的是c数组方法,可以考虑是内存不足导致无法显示,解决方法可以是选择小一点图片进行再次测试,或者在lv_conf文件中修改size大小

#define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/

2,若是使用的是文件直接访问,有可能是图片颜色位数不对导致,在解码器代码中,我们可以看到,在bmp解码器中,颜色深度需要为32位。可以使用不同解码器进行测试。

 

若是读者发现文章有什么问题,欢迎给博主留言指正!

end 

<think>好的,用户想知道如何在LVGL显示图片,并且需要示例教程。首先,我需要回忆一下LVGL显示图片的基本流程和相关API。根据提供的引用内容,特别是引用[1]和引用[3],显示图片的关键步骤包括配置显示驱动、转换图片格式、集成图片资源以及编写显示代码。 首先,确保显示驱动正确配置。引用[1]提到正确的配置和集成步骤是关键。LVGL需要初始化显示驱动和缓冲区,这部分通常在移植时完成。用户可能已经完成这部分,但需要确认是否正确设置,比如缓冲区大小和颜色格式是否正确。 接下来,图片需要转换成LVGL支持的格式,比如C数组或者bin文件。引用[3]提到了使用在线转换工具或者LVGL提供的脚本,比如lv_img_conv.py。这里需要详细说明如何将常见的PNG或JPG图片转换为C数组,可能还需要调整颜色深度以匹配项目设置,例如使用LV_COLOR_DEPTH 16或32。 然后是集成图片资源到项目中。用户需要将生成的C文件添加到工程中,并在代码中声明外部引用。比如使用LV_IMG_DECLARE宏来声明图片变量,这样在代码中才能正确引用。 接下来是编写显示代码。使用lv_img_create创建图片对象,设置图片源为转换后的变量,调整位置和对齐方式。可能需要使用lv_img_set_offset_x/y来微调位置,或者设置缩放和旋转等效果。同时,要确保图片资源在内存中存在,如果是外部存储,可能需要先加载到内存中。 另外,需要考虑图片存储的位置。如果图片存储在外部Flash或SD卡,需要使用文件系统接口读取,并使用lv_img_set_src加载。这部分可能需要参考LVGL的文件系统配置,确保路径正确。 用户可能需要示例代码,所以需要提供一个简单的例子,展示从转换图片显示的完整流程。同时,要提醒用户注意图片路径、颜色格式匹配以及内存管理的问题,比如大图片可能导致内存不足。 最后,根据用户的问题,生成相关问题,比如如何优化图片显示性能、如何处理透明图片、如何动态加载图片等,这些可以帮助用户进一步学习。</think>### 如何在LVGL显示图片LVGL显示图片需要经过**图片资源准备**、**驱动配置**和**代码实现**三个核心步骤。以下是详细操作流程: --- #### 1. 图片资源准备 LVGL要求图片数据以特定格式存储(如C数组或二进制文件)。推荐使用以下方法转换图片: - **使用在线转换工具**(如[LVGL Image Converter](https://lvgl.io/tools/imageconverter))将PNG/JPG转换为C数组。 - **命令行工具**:通过LVGL提供的`lv_img_conv.py`脚本转换(需安装Python环境): ```bash python lv_img_conv.py --format bin --bpp 32 input_image.png -o output_image.c ``` 参数说明:`--bpp`需与项目中的`LV_COLOR_DEPTH`设置一致(如16/32位)[^3]。 --- #### 2. 显示驱动配置 确保LVGL显示驱动已正确初始化,包括: - 设置缓冲区大小(至少屏幕分辨率的1/10): ```c static lv_disp_draw_buf_t disp_buf; static lv_color_t buf1[SCREEN_WIDTH * 100]; // 横向缓冲区 lv_disp_draw_buf_init(&disp_buf, buf1, NULL, SCREEN_WIDTH * 100); ``` - 注册`flush_cb`回调函数以处理像素渲染[^1]。 --- #### 3. 代码实现示例 以显示C数组格式图片为例: ```c // 声明图片资源(假设生成的文件为output_image.c) LV_IMG_DECLARE(output_image); void show_image(void) { // 创建图片对象 lv_obj_t *img = lv_img_create(lv_scr_act()); lv_img_set_src(img, &output_image); // 设置图片来源 // 居中显示 lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); // 可选:设置缩放(50%) lv_img_set_zoom(img, 128); // 128对应100%,64对应50% } ``` --- #### 4. 特殊场景处理 - **外部存储图片**:若图片存储在SD卡中,需先通过文件系统读取到内存: ```c lv_obj_t *img = lv_img_create(lv_scr_act()); lv_img_set_src(img, "S:/path/image.bin"); // 'S:'为注册的SD卡挂载点 ``` - **动态更新图片**:通过`lv_img_set_src`重新加载新资源。 --- #### 常见问题 1. **图片显示为灰色**:检查颜色深度是否匹配(`LV_COLOR_DEPTH`与转换时设置的`--bpp`一致)。 2. **内存不足**:减少单张图片分辨率或使用外部存储器。 3. **刷新闪烁**:增大缓冲区或优化`flush_cb`函数性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值