esp32-idf LVGL使用spiffs显示图片和GIF

不使用文件系统显示GIF和图片

我们打开官方的例程,LVGL文件目录下的components\lvgl-8.3.10\examples\libs\gif这个文件,这个是官方存放gif的例程,我们打开看看

#include "../../lv_examples.h"
#if LV_USE_GIF && LV_BUILD_EXAMPLES

/**
 * Open a GIF image from a file and a variable
 */
void lv_example_gif_1(void)
{
    LV_IMG_DECLARE(img_bulb_gif);
    lv_obj_t * img;

    img = lv_gif_create(lv_scr_act());
    lv_gif_set_src(img, &img_bulb_gif);
    lv_obj_align(img, LV_ALIGN_LEFT_MID, 20, 0);

   // img = lv_gif_create(lv_scr_act());
    /* Assuming a File system is attached to letter 'A'
     * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */
   // lv_gif_set_src(img, "A:lvgl/examples/libs/gif/bulb.gif");
    //lv_obj_align(img, LV_ALIGN_RIGHT_MID, -20, 0);
}

#endif

现在我们只关心上面段,下面那段是使用文件系统来显示图片的。
首先,我们要先将GIF转换成c语言数组,我们可以去官网网站上转换
在这里插入图片描述
接着,我们使用 LV_IMG_DECLARE(img_bulb_gif);去声明这个gif的数组,然后调用lv_gif_set_src(img, &img_bulb_gif);去设置图片源就可以显示GIF了。
注意,这个函数需要配置LV_USE_GIF 为1才行

在这里插入图片描述
图片也是同理,将图片转换成c语言数组就进行上面步骤即可。

使用文件系统显示GIF和图片(重点)

在使用文件系统时显示图片时和GIF我踩了很多坑,这次就来总结一下。

第一步,移植LVGL文件系统

我使用的是ESP32-S3片外Flash,用的时官方spiffs文件系统,具体这个文件系统的配置,可以看我之前的文章。我一开始是使用lv_post_template_fs.h这个文件来自己实现移植,后来一直移植不成功,无法正常显示图片。后来我发现,esp32官方提供的spiffs文件系统的api接口函数和stdio标准库里的接口函数使用方式是一模一样的,所以我就使用了lvgl里自带的文件系统(stdio的文件系统库)。

首先我们打开配置文件(注意,这里我没有使用sdk进行配置,因为我设置了使用自己lv_font.h进行配置,所以在sdk里配置并不会生效)
在这里插入图片描述
将LV_USE_FS_STDIO 置为1,如果你想使用别的文件系统,你也可以找到对应的文件系统打开就行。

  • LV_FS_STDIO_LETTER这个是驱动标识符,在文件系统中,通常会使用字母来标识不同的驱动器(如 Windows 系统中的“C:”、“D:”等),我们这里就使用,在spiffs里一般都是使用/来作为标识符。
  • LV_FS_STDIO_PATHLV_FS_STDIO_PATH 被用来设置文件系统的工作目录。
  • LV_FS_STDIO_CACHE_SIZE缓存大小:LV_FS_STDIO_CACHE_SIZE 被设置为 1024,这意味着在进行文件读取操作时,文件系统可以缓存最多 1024 字节的数据。

在这里插入图片描述
我们通过源码可以看到,LV_FS_STDIO_PATH这个通常是设置一个系统目录,这里我们就不设置了,我们手动输入一个系统目录

在这里插入图片描述
我们打开这个文件夹可以,查看我们文件系统的源码,

第二步,初始化文件系统

分为两步,第一步初始化我们的spiffs
第二部,调用lv_fs_stdio_init();绑定文件操作函数

void my_gui()
{
    lv_init();
    lv_port_disp_init();
    //初始化spiffs
    spiffs_init("storage","/spiffs",5);
    lv_fs_stdio_init();

}

第三步,调用gif函数显示gif动画

首先,我们将我们要显示的gif存入文件系统中,如果是图片,就先去转换成.bin文件

//gif动画
 void lv_example_gif_1(void)
{
    lv_obj_t * img;

    img = lv_gif_create(lv_scr_act());
    /* Assuming a File system is attached to letter 'A'
     * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */
    lv_gif_set_src(img, "/spiffs/bulb.gif");
    lv_obj_align(img, LV_ALIGN_LEFT_MID, 20, -30);
}

调用 lv_gif_set_src(img, “/spiffs/bulb.gif”);来设置图片源,记住,如果你之前LV_FS_STDIO_PATH没有配置,就填绝对路径,因为我这里是spiffs的文件系统,系统目录是/spiffs这个,这样就可以显示gif动画了

### 在LVGL框架中实现GIF显示 要在LVGL框架中实现GIF文件的显示,可以通过以下方法完成。首先需要将GIF文件转换为适合嵌入式系统的格式,并利用LVGL提供的API进行渲染。 #### 1. GIF文件转换 由于嵌入式系统通常无法直接解析GIF文件,因此需要先将GIF文件转换为适合嵌入式环境的格式。可以使用在线工具或自定义脚本将GIF帧序列转换为C数组[^2]。具体步骤如下: - 使用在线转换器(如LVGL提供的在线图像转换工具)将GIF文件的每一帧转换为RAW颜色格式。 - 将每帧数据导出为C数组形式,便于在嵌入式环境中加载处理。 #### 2. 嵌入式GIF帧管理 为了在LVGL显示GIF动画,需要对GIF的帧序列进行管理。可以通过创建一个缓冲区来存储所有帧的数据,并通过定时器控制帧的切换[^3]。代码示例如下: ```c #include "lvgl/lvgl.h" // 定义GIF帧数组 const uint8_t gif_frame_1[] = { /* 第一帧数据 */ }; const uint8_t gif_frame_2[] = { /* 第二帧数据 */ }; // 添加更多帧... // 创建LVGL图片对象 lv_obj_t *gif_img; // 初始化GIF显示 void init_gif_display() { gif_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(gif_img, gif_frame_1); // 设置初始帧 } // 切换GIF帧 void switch_gif_frame(uint8_t frame_index) { const uint8_t *frames[] = {gif_frame_1, gif_frame_2}; // 添加更多帧 if (frame_index < sizeof(frames) / sizeof(frames[0])) { lv_img_set_src(gif_img, frames[frame_index]); } } ``` #### 3. 动画定时器 为了实现GIF动画效果,可以使用LVGL的定时器功能来控制帧的切换频率。以下是一个简单的定时器实现示例: ```c static uint8_t current_frame = 0; static uint8_t total_frames = 2; // 总帧数 void gif_animation_timer_cb(lv_timer_t *timer) { switch_gif_frame(current_frame); current_frame = (current_frame + 1) % total_frames; } void start_gif_animation() { lv_timer_t *timer = lv_timer_create(gif_animation_timer_cb, 100, NULL); // 每100ms切换一次帧 } ``` #### 4. LVGL移植与优化 确保LVGL框架已正确移植到目标平台。如果尚未完成移植,可以参考相关文档完成基础移植、DMA加速及源码级优化[^4]。这将显著提升GIF动画的显示性能。 --- ### 注意事项 - 确保GIF帧数据的格式与LVGL支持的颜色格式一致,否则可能导致显示异常。 - 如果GIF文件较大,建议对帧数据进行压缩或分段加载,以减少内存占用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值