LVGL 中图片使用问题
此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题。最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过程中直接无法看,折腾了一会直接懵逼了,尝试了各种办法都没搞定,后来发现是我没有好好看文档,导致的问题,这里特意记录一下。
一、基本信息
- lvgl 版本:8.3
- 使用环境:linux
- 屏幕大小:480 *800
二、lvgl外部文件使用
为了方便后面的学习,这里先记录一下在 linux 中通过 lvgl 使用外部文件的方式,有需要的可以参考一下,好像其他博主很少特意记录这个问题,我也折腾了好一会
打开外部文件使用
lvgl 在8.0后就已经集成了 文件系统的使用,不需要像之前那样进行移植,只需要打开一下对应的配置宏即可。
打开 LV_USE_FS_POSIX 宏,如下图所示:
注意:
- 注意图中的四部分,其中②就是在 linux 中使用外部文件必须要打开的,开启方式如图所示,特别需要注意的是其中的A可以配置成任意字符,这里只是标号,稍后在使用的时候会有介绍。
- ①部分开启的是在 SD 之类的外设中使用的,比如 STM32 和 esp32 等
- ③部分开启的是在 windows 中的外设使用。
- ④部分打开后使用的是通过自定义的文件系统进行使用的。
使用方式
使用方式分相对路径和绝对路径,如下所示lv_obj_t *img_btn = lv_imgbtn_create(home_scroll_objx); // 创建按钮 /* 通过相对路径使用 */
lv_imgbtn_set_src(img_btn, LV_IMGBTN_STATE_RELEASED, NULL, "A:./lv_res/images/home/img_cogwheel_argb.jpg", NULL); /* 通过绝对路径使用 */
lv_imgbtn_set_src(img_btn, LV_IMGBTN_STATE_RELEASED, NULL, "A:/home/lv_res/images/home/img_cogwheel_argb.jpg", NULL);
注意:因为配置是 LV_FS_POSIX_LETTER 'A',所以在路径中要添加
A:
进行匹配,这里我尝试过不能将 "A:" 配置到 LV_FS_POSIX_PATH 宏中,不然无法使用,
也有不一样的配置方式,如下所示:/*API for open, read, etc*/
#define LV_USE_FS_POSIX 1
#if LV_USE_FS_POSIX
#define LV_FS_POSIX_LETTER '/' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_POSIX_PATH "/" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif /* 使用方式 */
lv_imgbtn_set_src(img_btn, LV_IMGBTN_STATE_RELEASED, NULL, "/home/lv_res/images/home/img_cogwheel_argb.jpg", NULL);
但是这样操作后,就不能通过相对路径进行使用,可以根据自己的需要进行配置。
三、图片加载
这里主要有三种加载方式,如下所示:
通过 JPG 解码器将 JPG 转换为 C 数组
通过转换器将 JPG 转换为 SJPG
直接 LVGL 集成的解码器直接使用外部的 jpg、png、bim图片
通过 JPG 解码器将 JPG 转换为 C 数组
这里我之前有笔记记录过,所以就不详细介绍了,有需要的可以看看,LVGL 显示图片。通过转换器将 JPG 转换为 SJPG
这里是通过 LVGL 提供的插件将 jpg 转成 sjpg,插件是 python 插件,所以在使用之前需要安装 python 环境
转换器在源码中可以找到,路径是:lvgl/scripts 目录下的 jpg_to_sjpg.py
在使用之前先确保安装 pillow 组件,安装命令如下
# 安装命令
pip install pillow
# 卸载命令
pip uninstall pillow
进行图片装换,操作如下
# windows CMD
jpg_to_sjpg.py img_cogwheel_argb.jpg # windows PowerShell
./jpg_to_sjpg.py img_cogwheel_argb.jpg # linux
python3 jpg_to_sjpg.py img_cogwheel_argb.jpg
转换完成后会在文件中生成一个 SJPG 和 C 文件,系统的小伙伴可以发现,这里的使用方式和方式1的区别不是很大,只是在 SJPG 文件中加入了一些描述信息
使用方式:
lv_imgbtn_set_src(img_btn, LV_IMGBTN_STATE_RELEASED, NULL, "A:./lv_res/images/home/img_cogwheel_argb.sjpg", NULL);
直接 LVGL 集成的解码器直接使用外部的 jpg、png、bim图片
这里比较简单了,上面中已经演示了使用方式,开启外部文件使用后,直接加载图片名称即可,如下所示lv_imgbtn_set_src(img_btn, LV_IMGBTN_STATE_RELEASED, NULL, "A:./lv_res/images/home/img_cogwheel_argb.png", NULL);
注意:在使用外部图片时,连续加载图片时会很慢,这个是因为没有打开对应的图片缓存机制,每次使用时都是通过解析器进行解析,所以速度比较慢。
直接打开#define LV_IMG_CACHE_DEF_SIZE 1
宏即可,但是这个操作会消耗内存控件,此操作对于方式1来说是没有意义的。
注意:在更改头文件的宏时,最好清除一下工程从新编译,不然可能出现各种奇怪的问题。笔记到此结束,有写的不好的地方望各位大佬指出。
参考链接
JPG decoder(JPG解码器):http://lvgl.100ask.net/8.1/libs/sjpg.html
ESP32开发学习 LVGL Littlevgl 解码显示JPG图片三种方式:https://blog.csdn.net/cnicfhnui/article/details/119377567
最新文章
- RN中listView的每个item等高
- [No000028]Python的使用之禅及程序员应该明白的一些道理
- iOS - 线程管理
- php大力力 [005节] php大力力简单计算器001
- 大数据平台搭建(hadoop+spark)
- 我的一点关于把WndProc指向类的成员函数的看法
- 【转】 Xcode基本操作
- Android 判断当前线程是否为主线程
- 计算机学院大学生程序设计竞赛(2015’12) 1005 	Bitwise Equations
- TP 3.2.3 接入PHPMailer
- SQL Server get SP parameters and get output fields type information
- Go语言环境安装&;搭建(Win)
- P3301 [SDOI2013]方程
- 让TQ2440也用上设备树(2)
- openstack-networking-neutron(一)---端到端和点到点的理解
- springcloud-eureka简单实现
- 【bzoj4712】洪水 动态dp
- html中常用的标签元素
- centos7.5英文环境切换到中文环境,再切回中文环境后 ,terminal不能用
- Python中 and,or 的计算规则