lvgl的图片使用 您所在的位置:网站首页 flash可以导出jpg格式图片吗 lvgl的图片使用

lvgl的图片使用

2023-12-27 04:45| 来源: 网络整理| 查看: 265

        界面库lvgl使用图片有三种方式:

1、将图片转换为源文件使用

        转为源文件使用则需要使用在线或者离线图片转换工具,在线转换工具可使用官方提供的https://lvgl.io/tools/imageconverterhttps://lvgl.io/tools/imageconverter        离线转换工具可以用git上大神封装的Windows版本的Lvgl_image_convert_tool: 基于LVGl图片转换离线版封装的小工具,不仅有界面,还可以一键生成到项目里哦 (gitee.com)https://gitee.com/gzmarkz/Lvgl_image_convert_tool        也挺好用,自行下载,使用方法就不多说了,一看就会。

        转换生成的代码放到自己的工程中,然后在代码中添加:        

LV_IMG_DECLARE(my_test_img); lv_obj_t * img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(img, &my_test_img);

        则可以正常显示图片。

        此方法的好处是不管是png、jpg还是gif格式,基本都能通过这种方式来使用,但却有个坏处,就是图片文件本身并不大,但转换后的源码文件却比较大,比如我试过一张图片不到100k,转换后的源文件就又10+M,这样对于嵌入式系统本身存储较小的就会是个问题。

2、直接使用图片

        在lvgl库的8.0版本开始,是支持直接使用图片的,8.0版本之前,因为没有集成图片格式的解码器,所以不能直接使用。8.0之前的版本要使用需要直接添加指定图片格式的解码库,比较麻烦,8.0开始将解码库集成到了lvgl中,因此可以直接使用。

        具体使用的代码很简单,连图片变量的声明都不需要了,像这样:

        

lv_obj_t * img = lv_img_create(lv_scr_act()); lv_img_set_src(img, "./lv_lib_png/png_decoder_test.png");

       实际操作却不像代码看上去那么简单,现根据个人研究的经验简单介绍下lvgl的8.0版本直接使用图片文件的步骤。

        1、首先需要打开lv_conf.h中指定图片格式功能的宏定义,如LV_USE_PNG等,头文件支持的图片文件格式有PNG、BMP、SJPG、GIF几种,这里以PNG为例说明操作步骤,修改PNG的宏定义LV_USE_PNG的值为1;

/*PNG decoder library*/ #define LV_USE_PNG 1

        2、由于使用图片文件需要用到文件系统,因此需要同时打开lvgl内置的文件系统的功能支持。lvgl内置的文件系统支持STDIO标准文件系统、POSIX文件系统、Windows的win32文件系统、以及FATFS文件系统。根据文件系统代码逻辑,只需要将对应的宏的值修改为一个字符,用来代表类似卷标的符号即可,如修改LV_USE_FS_STDIO的值为字符A:

/*File system interfaces for common APIs *To enable set a driver letter for that API*/ #define LV_USE_FS_STDIO 'A' /*Uses fopen, fread, etc*/

        修改好之后,在代码中加入使用图片的代码,如:

lv_obj_t * img; img = lv_img_create(lv_scr_act()); lv_img_set_src(img, "A:/home/XXX/png/wink.png"); lv_obj_center(img);

        这里的wink.png是lvgl的8.0版本带的png解码库的使用例子中的一张图,可以自行搜索其所在位置。比较重要的一点是设置的这个路径“A:/home/XXX/png/wink.png”要是图片文件所在的路径并且冒号后面这个路径是绝对路径。但是在实际工程中可能需要设置相对路径的情况。对于相对路径的情况说明一下,经过验证相对路径是相对于执行程序存放的路径而言,比如执行文件所在路径为:/root/pathA/bin/,且图片文件的路径为:/root/pathA/res/pic/,那么代码里面写的相对路径就应该是这样的形式: A:./../res/pic/wink.png,这样在程序执行过程中,就能找到对应的图片,否则的找不到图片虽然不会报错,但也就无法在界面上显示图片。

        实际无法显示图片的时候,可以自行调试,从lv_img_set_src()函数往内部单步调试查看,但文件系统里面其实是没有写任何报错原因的,需要的话可以自己加上调试日志来定位无法显示图片的原因。我在lv_fs.c的lv_fs_open()函数中,调用系统文件操作的回调函数drv->open_cb()的错误返回增加日志打印,可以确定无法正常显示的原因。

        其他图片格式修改的地方基本也是一样的,根据自己的需要进行代码调整即可。官方文档中并未给出专门的说明,写在这里记录下过程,希望对有同样困惑的朋友有帮助。

        3、对于界面显示的图片资源比较多的情况,可能需要修改lv_conf.h中LV_MEM_SIZE宏的大小,否则会出现图片加载成功但是图片位置却显示No data的情况,如图:,具体大小根据自己实际情况修改;如果不想修改此大小,可以直接修改LV_MEM_CUSTOM为1,则使用系统的内存管理函数,相关说参见另外一篇博文:(1条消息) lvgl的内存管理函数_kelleo的博客-CSDN博客icon-default.png?t=M0H8https://blog.csdn.net/kelleo/article/details/122835525

        另:启用文件系统后,后缀为.bin的字体也可以使用了,这个还没试,后续试了再来补充。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有