最终运行效果,三张图,三种方式:jpg,sjpg,c_array

LVGL开发中经常用到图片显示,LVGL官方有提供PNG,GIF,JPG等解码库,配合LVGL的虚拟文件系统可以实现控件直接加载调用解码库解码并显示,非常的方便。

此篇文章就介绍如何移植LVGL官方的JPG解码库,通过三种方式来显示JPG图片。

1、文件系统加载JPG文件解码显示

此方法占用RAM多,占用ROM少,解码速度慢

2、转换为SJPG文件通过解码文件系统加载显示

sjpg 是一种基于“普通”JPG 的自定义格式,专为 lvgl 制作。sjpg 是“split-jpeg”,它是一捆带有 sjpg 标头的小 jpeg 片段。解码更快,体积更小,占用内存也小。要通过LVGL提供的python脚本来转换。

3、转换为数组加载显示

将JPG解码,把其中的有效像素提取为C数组,以.c文件的方式存储在代码中。此方法解码速度最快,占用内存少,占用ROM最多。

本文开发环境:
Visual Studio Code V1.58.2

LVGL版本 V7.10.0

芯片平台:ESP32

IDF库版本:4.3.0

IDF TOOLS编译工具链版本:2.9

本文软件基于LVGL官方提供的ESP32工程lv_port_esp32修改而来

LVGL ESP32官方地址:https://github.com/lvgl/lv_port_esp32

开发板平台:HelloBug ESP32开发板

开发板购买链接:https://hellobug.taobao.com/

注意:在开始之前请确认上述开发环境,并确认你的源码必须已经移植并对接了LVGL的虚拟文件系统。没有实现的朋友参考我的另一篇文章:ESP32开发学习 LVGL Littlevgl 使用文件系统

一、移植LVGL_JPG/SJPG解码库

第一步就是先下载lvgl官方的JPG/SJPG解码库

git地址:https://github.com/lvgl/lv_lib_split_jpg

将下载好的的解码库解压至你的工程目录components文件夹中,目录结构如下:

下载好的解码库中是没有CMakeLists.txt这个文件的,我们的工程是没办法调用这个库的,我们在lv_lib_split_jpg文件夹中创建一个,内容如下:

接着修改main文件夹中的CMakeLists.txt,idf_component_register中添加注册lv_lib_split_jpg解码组件,结果如下图:

在main.c中添加lv_sjpg.h解码库头文件

在main.c中lvgl初始化 文件系统初始化之后添加jpg解码库初始化

至此,解码库的移植就完成了,接下来就是调用解码了。

看以下三步前,请确保你的lvgl工程已经对接文件系统

二、解码显示JPG文件

直接调用SD卡里面的JPG解码显示,非常简单,三行代码就能实现,其中S:/image/test_jpg.jpg是你的SD卡中的图片路径(注意,图片不要太大,否则会内存分配失败)

 ///创建一个IMG对象并加载SD卡中的jpg图片解码显示/////lv_obj_t * objpg =  lv_img_create(main_scr, NULL);               // 创建一个IMG对象 lv_img_set_src(objpg, "S:/image/test_jpg.jpg");                  // 加载SD卡中的JPG图片lv_obj_align(objpg, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);           // 重新设置对齐

三、解码显示SJPG文件

SJPG占用内存小,是专门针对LVGL的,LVGL官方做了一个python脚本来转换格式,SJPG文件更小,但不能在电脑上打开查看。接下来讲解脚本使用方法和调用图片方法

1、安装python

LVGL官方提供的转换工具是一个python脚本,你的电脑上必须要有python环境,开发ESP32编译时也用到python脚本,也必须要安装python,所以这里安装方法不在详细说明,网上很多教程,我的博客ESP32开发环境搭建中也有Python安装的教程,需要注意的一点就是安装时要将Python添加到系统变量的一个选择勾选一下即可。其它全部默认

2、安装python PIL模块

图片转换需要用到Python的PIL模块,python默认安装是没有的,如果不安装,转换图片会提示没有PIL模块,具体安装解决办法请看我的另一篇文章:报错:ModuleNotFoundError: No module named ‘PIL‘解决方法

3、转换JPG到SJPG

接下来就是转换脚本的使用了,文章第一步时我们从LVGL git上下载了jpg解码库,转换脚本就在里面,在电脑上打开你的工程目录中components\lv_lib_split_jpg\scripts这个路径,里面有一个jpg_to_sjpg.py的python脚本。先下载张jpg图片,放在此文件夹中。

复制此文件夹的目录,打开系统cmd窗口,在命令行进入脚本所在的路径。

接下来输入命令来转换图片格式,命令:jpg_to_sjpg.py jpg_100.jpg

其中jpg_100.jpg是我刚才下载的图片,敲回车开始转换,转换非常快,不到0.1秒

成功后查看这个目录中,生成了两个文件:jpg_100.sjpg     jpg_100.c,其中.c的文件是我们第四步要用到的,懂的同学看到.c就知道怎么用了,这里先不讲。

4、调用SJPG解码显示

将上一步生成的.sjpg文件放到你的sd卡中,插入开发板。

然后编写代码调用它,非常简单,也是三行代码即可。

 ///创建一个IMG对象并加载SD卡中的sjpg图片解码显示////lv_obj_t * obsjpg =  lv_img_create(main_scr, NULL);              // 创建一个IMG对象 lv_img_set_src(obsjpg, "S:/image/test_sjpg.sjpg");               // 加载SD卡中的SJPG图片lv_obj_align(obsjpg, NULL, LV_ALIGN_IN_TOP_LEFT, 200, 0);       // 重新设置对齐

四、解码显示C Array数组的JPG文件

经过第三步其实我们已经将JPG文件转换成了C语言数组,就是那个 jpg_100.c文件,接下来就简单了。将 jpg_100.c文件移动到工程目录下components\lv_examples\lv_examples\assets资源目录下,这里不要复制,要剪切,因为生成的.c文件也在工程目录里面,只是要移动一个位置,不然会有两个相同的文件。

接下来在main.c中定义引用:LV_IMG_DECLARE(jpg_100);

在lvgl代码中同样的添加三行代码即可调用显示

 ///创建一个IMG对象并加载ROM中的jpg图片C Array数组显示///lv_obj_t * carrayjpg =  lv_img_create(main_scr, NULL);          // 创建一个IMG对象 lv_img_set_src(carrayjpg, &jpg_100);                           // ROM中的jpg图片C Array数组显示lv_obj_align(carrayjpg, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 100);    // 重新设置对齐

最终运行效果

三张图,三种方式:jpg,sjpg,c_array

ESP32开发学习 LVGL Littlevgl 解码显示JPG图片三种方式JPG_SJPG_C Array相关推荐

  1. ESP32开发学习 LVGL Littlevgl 创建显示二维码

    生成效果: LVGL除了一些常用UI控件外,还提供了很多第三组件可以集成,例如jpg,bmp,gif,png,二维码. LVGL提供的生成器使用的是 nayuki 的二维码生成器,本文我们就来移植LV ...

  2. 教机器遗忘或许比学习更重要:让AI健忘的三种方式

    大数据文摘出品 编译:臻臻.Shan LIU.龙牧雪 大部分人不会喜欢遗忘的感觉. 回到家顺手把钥匙丢在一个角落就再也想不起来放在哪儿了,街角偶遇一个同事却怎么拍脑袋也叫不出他的名字--我们害怕遗忘, ...

  3. uniapp学习,阿里云图标引入的三种方式,小程序头部底部搭建,

    1.uniapp项目引入阿里云图标的方式 1.进入阿里云官网官网,选择图标,保存进自己项目,并下载到本地 目录结构如下 .ttf文件是Unicode方式引入图标 .css文件结尾的是 font cla ...

  4. opencv学习(四)之像素遍历三种方式

    在上一篇文章中介绍了图像颜色空间缩减.查找表等内容.在对图像像素进行遍历时共有三种方法: (1). C操作符[] (指针方式访问) (2). 迭代器iterator (3). 动态地址计算 这三种像素 ...

  5. Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date; Date date = new Date();System.out.println((1900+date.getY ...

  6. java如何显示当天世界_Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date;Date date = new Date(); System.out.println((1900+date.getY ...

  7. cocos中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

    CCLabelTTF CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建..这意味着setString 和创建一个新的标签一样慢. 这个类使 ...

  8. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

    在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF LabelBMFont LabelAtlas LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率 ...

  9. Spark Scala语言学习系列之完成HelloWorld程序(三种方式)

    三种方式完成HelloWorld程序 分别采用在REPL,命令行(scala脚本)和Eclipse下运行hello world. 一.Scala REPL. windows下安装好scala后,直接C ...

  10. js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理...

    动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...

最新文章

  1. 单线程和多线程的优缺点(转)
  2. freebsd ports安装mysql_FreeBSD Ports 方式安装MySQL及注意事项
  3. MySql入门知识(一)
  4. Boost Asio总结(9)数据缓冲区class mutable_buffer和const_buffer
  5. PHP 5.6.30连接SAP GUI 730 配置(SAPRFC)
  6. 域客户端的计算机更名
  7. Tensorflow Lite之编译生成tflite文件
  8. string.h包含哪些函数_Excel进行数据分析常用方法及函数汇总—【杏花开生物医药统计】...
  9. 表变量和临时表的使用
  10. Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务
  11. mysql外键实例学生成绩_mysql 外键(foreign key)的详解和实例
  12. URAL 1022 Genealogical Tree
  13. java 类的继承 例题_Java_接口与类之间继承例题
  14. matlab 深度学习环境配置
  15. Hybrid和Tagged Untagged理解
  16. 【密码学】一文读懂ZUC算法
  17. 博思特POSITAL编码器OCD58-CA1212-B15V-H3P
  18. 计算机检测不到蓝牙,图解Win10 1809系统中检测不到蓝牙设备的方法
  19. 平平无奇的营销小天才——ChatGPT
  20. OPENMP学习笔记(1)——简介,模型,运行

热门文章

  1. pe版linux操作系统制作,制作Linux版PE系统
  2. 计算机网络 同步传输和异步传输
  3. 艾永亮:酒瓶中的战争,谁是下一瓶被拿起的葡萄酒
  4. javaScript 琐碎
  5. 【MOOC】计算机网络与通信技术笔记(北交)(3)数据链路层
  6. 禁用Insert按键
  7. Entity Framework入门
  8. 深度学习--python 读取并显示图片的方法
  9. 1192: 删除记录(结构体专题)
  10. IT4IT 标准助力 IT 经理控制乱局