LVGL常用部件使用总结之图片部件

news2024/12/25 9:02:35

图片部件可用于显示图片,图片源可以是 C 语言数组格式的文件、二进制的.bin 文件以及图标字体。值得注意的是,图片部件要显示 BMPJPEG 等格式的图片,则必须经过解码。

图片部件的组成部分仅有一个:主体(LV_PART_MAIN

图片源选择

图片部件的图片来源分为三种:C 语言数组;存储在外部的图片文件;图标字体(详见8.2 章节)。接下来,我们详细介绍上述三种图片源的使用方法:

C语言数组

上面的网址如下:Online image converter - BMP, JPG or PNG to C array or binary | LVGL

这里有几个问题需要我们注意下:

刚进入这个界面,估计看不到这个转换的界面,只能看到一些文字介绍,我们稍微等一等,就会出现了;

没有加载图片之前,转换界面是上面那样的,导入图片之后,就会多了个文件名称的选项,这里的名称默认就是图片的命名,如下所示:

我们可以修改这个名称,也可以不改,但是这个名称我们后面会用到,所以推荐做好管理。

选项选好之后我们点击Convert,转换完成后,我们就会得到一个以刚才那个名字命名的c文件

可以看到,这个文件有4M之大,我导入的图片尺寸是320*240的,图片本身大小为43K,竟然一下子变得那么大,那这个文件里面到底是什么样的内容呢?

在熟悉文件内容之前,有个问题得再次强调下:

运行之前内存中是没有数据的,所有代码信息都存在flash里面,内存中的数据是运行时从flash中加载进去的,用完就会释放,所以内存够不够,并不能看总的数据,而是要看同一时间加载进入内存的数据量是不是会溢出。

继续看文件内容

打开看看

这个文件里面有两块内容

一个就是图片对应的数组变量

这个数组加了const前缀,所以处于常量区,数组的名称也是刚才上面取的名称后面加了个_map

这一块值得注意的是,在转换器C数组(变量)中,所有颜色深度(1、8、16或32)的位图都包含在C文件中

把文件接着往下拉,就会看到这些颜色深度通过宏定义进行了选择

1位或者8位对应的数据

16位并且不交换字节时对应的数据

16位并且交换了字节时对应的数据

32位对应的数据

虽然这些颜色深度的数据都放进来了,但是只有与lv_conf.h中的LV_COLOR_DEPTH匹配的颜色深度才会实际链接到生成的可执行文件。

第二块就是基于这些数据,LVGL为自己定义的一个变量,提供给我们引用的,这是个结构体变量,里面除了图片数据,还定义了图片的一些属性参数。

如下:

这里可引用的名称和我们之前转换时所取的名称是一样的。

我们只会用到一种颜色深度,所以尝试把其他不要的数据都删掉看看。

前提是别删错了数据。

删掉之后数据变成了900多K

可以大大减小图片文件的占用内存。

我们试着将删减前的完整文件导入程序中,看看能不能显示。

这里我担心一个问题,那就是4M大小的c文件,电脑倒是能放得下,但是工程链接之后,会占用多少单片机的Flash呢?运行之后会占用单片机多少内存呢?会不会不够用?

我们先看下没有加入图片之前的空间占用情况

内存占用82.41kB,Flash占用196.24kB

我用的是F407,内存192k,Flash是512k

接着看加入图片之后的情况

将刚才的文件复制进入工程文件里,然后在keil里导入

然后编译看看

此时,编译还不会产生空间占用,因为还没有使用,所以就不会被链接。

可见,此时这个4M大小的图片,占用的还只是我电脑上的存储空间,所以文件大也没什么关系,影响的只是我们的整个工程的占用空间,跟最终烧录的文件没关系。

我们尝试着使用这个图片文件

注意,图片源变量必须要先声明再引用,其实就算LVGL不引用,我们自己也要声明外部变量,才能被调用,并且,引用的是指针。

其实就三个步骤:

声明图片源;

创建图片对象;

设置图片源。

此时编译后查看空间占用情况

显然flash占用情况提高了将近150kB,但是内存占用没有太大的增长。

这样来看,如果图片太多了,自带的空间肯定就不够用了。

可是我现在想要用图片做背景,然后切换页面,需要用到几十张图片,怎么办呢?

虽然切换页面时,内存可以释放再切换,但是这个素材要怎么处理呢?

这个问题后续得想办法解决下,我们先把刚才使用的图片下载看看能不能显示。

经确认,可以正常显示。

我们再用加一张图片切换下试试看。

加了两张图片后,Flash占用又大了

下载看看,可以实现切换效果,但是过程中发现一个问题,那就是不断切换图片,图片切换越来越慢,猜想应该是不断切换,导致不断创建图片对象,而之前的图片对象还没有删除,所以导致内存空间越来越小。

于是又有个疑惑,这里都是局部变量,出函数就释放了,为啥还要手动删除?

就算我想删除,也识别不到对方的对象呀。

这种情况下,我们可以将页面对象都上升成全局变量

烧录后可以解决这个问题。关于更详细的多页面管理和切换,后续会专门讲解。

至此,就算完成了c数组作为图片源显示图片的操作。

其实这里还有个疑惑,开头说的这句话

这里说要解码,可是我这一顿操作下来,也没有哪里涉及到解码了呀。

咋回事

我们先来了解下什么是图片的编码。

各类型的图片为了实现对应的要求,比如不失真,比如体积小等等,就要对原始的像素数据进行相应的处理,不同的处理就对应了不同的图片格式,因此编码就是将原始像素数据给处理成其他的一套编码数据,方便传输加密等等。

有编码,就有解码,就是将这一套编码数据给解析成原始的像素数据,然后在屏幕上显示出来。

图片解码是将原始的图像数据转换为可用于显示的格式的过程。常见的图片格式包括JPEG、PNG、BMP等。为了能够在嵌入式设备上高效地进行图片解码,通常会使用专门的图像解码库,例如1ibjpeg、1ibpng等。这些库提供了丰富的API和算法,能够有效地解码各种图片格式。

图片解码的步骤通常包括以下几个环节:

更多可参考这篇文库《关于图片的解码和显示》

为了弄懂上面提到的解码库的问题,关键就是搞清楚网站生成的c数组是带图片格式的数据,还是就是像素数据,如果是带格式的数据,那么lvgl就肯定就是使用了内置的解码库,如果是像素数据,那么就说明网站所做的操作其实就是解码的过程,LVGL直接将其刷到显存中即可,不必再次解码。

怎么确定是哪种呢?

我做了张纯红色的图片,导入之后转换,结果如下:

全是F800,这其实就是纯红色的像素数据。

而且,之前的移植中根本就没有把解码库加进工程里。

由此可见,这个网站得到的就是像素数据,也就是说,这个网站已经把图片进行了解码。

我们导入后直接使用就行了。

关于图片编码和解码,上面有个现象可以结合理解,上面我的一张PNG图片只有40多K,但是解码后得到的文件大小有900多K,这就是因为PNG在磁盘里存的是带格式的编码数据,为了显示转化成原始像素数据后,就占用了很大的空间,我这里单片机开发是直接读取的解码后的数据,所以要将这些原始数据直接存放在flash中,但是电脑里放的就是PNG格式的编码数据,要想显示,就得在内存读取时,先经过解码器解析成原始数据,二者的逻辑是不一样的,要注意体会和区分。

外部图片源文件

在上面C语言数组方式中,有个很大的问题,那就是我只使用了两张图片,就已经占用了将近500k的falsh,这显然是不行的,我需要使用的图片有大概50张,如果一张的大小是150k,那么就需要8M的空间才行。

怎么办呢?

解决办法就是将这些图片以网站生成的bin文件形式放在外部Flash,然后使用LVGL自带的文件系统来读取素材。

这一部分内容较多,后续专题讲解。

图标字体

API函数 

我们介绍 LVGL 图片部件常用的 API 函数:

解码库

根据各种资料我们知道,LVGL集成了图片的解码库,既然这种C语言数组的方式网站已经帮我们解码了,这个解码库有什么用呢?

我所能想到的应用场景就是,一个外部存储介质,比如SD卡或者U盘,里面放的就是一张PNG或者BMP等原格式的图片,里面存的是带格式的数据,现在我设备要读取这张照片,读到的就是带格式的数据,这种情况下没有网站给你转成像素数据,所以就只能LVGL自己来解码,将这个数据转成像素数据了。

这应该就是解码库的使用场景。

上面说的电脑里的PNG图片只有40多K,这就是存放的格式编码数据,计算机为了显示,就得集成对应的解码器,才能将其解析成像素数据然后显示出来。

而上面说的三种方式,网站已经帮我们解码了,所以这几个场景下,都无需使用解码库。

待解决问题

那么,就还剩下两个问题:

还有就是如何合理地管理和切换各个页面?

再就是图片作为整个背景,上面还能叠加一些小尺寸的图片吗?

后续再专门讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB4之ASM2464PD与ASM2464PDX兼容与运用

首先在NVMe上运用: 一:ASM2464PD(现在可以做带PD的方案) 二:ASM2464PDX 1: Application Guide- CFX card reader NVMe SSD 2:ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三&#xff…

Day09:基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

目录 算法加密-概念&分类&类型 加密解密-识别特征&解密条件 解密实例-密文存储&数据传输 思维导图 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&am…

【数据分享】2000~2023年MOD15A2H 061 光合有效辐射分数FPAR数据集

​各位同学们好,今天和大伙儿分享的是2000~2023年MOD15A2H 061 光合有效辐射分数FPAR数据集。如果大家有下载处理数据等方面的问题,可以评论或私信。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN G…

ESU毅速:3D打印随形水路为模具制造带来革命性飞跃

随着科技的飞速发展,3D打印技术已逐渐成为制造业的重要支柱。它通过逐层堆积材料,为我们带来了前所未有的生产方式和可能性。在众多3D打印技术中,随形水路技术以其独特的优势,正引领着制造业的一场革命性变革。 3D打印随形水路的定…

git安装与使用4.3

一、git的安装 1、下载git包 下载git包url:https://git-scm.com/download/win 下载包分为:64位和32位 2、点击安装包 2、选择安装路径 3、 点击下一步 4、点击next 5、点击next 6、点击next 7、 8、 9、 10、 11、 12、在桌面空白处,右键…

AI智能分析网关V4智慧商场方案,打造智慧化商业管理生态

AI智能视频检测技术在商场楼宇管理中的应用越来越广泛。通过实时监控、自动识别异常事件和智能预警,这项技术为商场管理提供了更高效、更安全的保障。今天我们以TSINGSEE青犀视频AI智能分析网关为例,给大家介绍一下AI视频智能分析技术如何应用在商场楼宇…

全排列 全排列 II N皇后

46.全排列 力扣题目链接(opens new window) 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 递归终止条件:当收集元素的数组path的大小达到和nums数组…

动态规划DP之背包问题2---完全背包问题

目录 DP分析: 状态转移方程: 代码: 例子: 与 01背包问题 不同点在于,每种物品可以使用无限次。 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。 第 i 种物品的体积是 vi,价值是…

CV论文--2024.3.1

1、UniMODE: Unified Monocular 3D Object Detection 中文标题:UniMODE: 统一的单目三维物体检测 简介:实现统一的单目3D物体检测对于机器人导航等应用至关重要,涵盖了室内和室外场景。然而,训练模型需要涉及各种场景的数据&…

解决ODOO12 恢复数据库提示内存不够报错

1. 现象 点击 ‘restore database’ 控制台报错: 2. 解决措施 a. 进入启动脚本的文件夹 cd odoo/odoo-12.0/输入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新页面…

巧用眼精星票证识别系统将车辆合格证快速转为结构化excel数据,简单方便

眼精星票证识别系统是一款高效且精准的OCR软件,它的魔力在于能将纸质文档迅速转化为电子文档,并实现自动化的数据结构化处理。它拥有一双"火眼金睛",无论是各类发票、护照,还是车辆合格证等,都能一一识别。而…

谷歌seo推广秒收录怎么做?

谷歌SEO推广秒收录想要做到,可以利用我们光算科技独家技术,GSI快速收录,通过技术手段和操作,帮你的网站快速被谷歌发现和记录 这项技术具体核心就是GPC爬虫池系统,这个系统是专门研究谷歌搜索引擎优化的规律和算法创造…

vulhub中Tomcat PUT方法任意写文件漏洞复现(CVE-2017-12615)

漏洞原理 漏洞本质Tomcat配置了可写&#xff08;readonlyfalse&#xff09;&#xff0c;导致我们可以往服务器写文件&#xff1a; <servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</s…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案&#xff0c;用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能&#xff0c;同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置&#xff0c;支持跨平…

SD NAND:为车载显示器注入智能与安全的心脏

SD NAND 在车载显示器的应用 在车载显示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多种应用&#xff0c;其中一些可能包括&#xff1a; 导航数据存储&#xff1a; SD NAND 可以用于存储地图数据、导航软件以及车载系统的相关信息。这有助于提…

[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;792 标注数量(xml文件个数)&#xff1a;792 标注数量(txt文件个数)&#xff1a;792 标注类别…

了解处理器

了解处理器 摘要写在前面1. 计算机简介1.1.计算机发展简史1.2.计算机分类1.3.PC机结构 2.初识处理器2.1.处理器的硬件模型2.2.处理器的编程模型2.3.处理器的分层模型2.4.如何选择处理器 3.指令集体系结构3.1.处理器编程模型3.2.指令集发展历程3.3.指令集分类3.4.汇编语言格式3.…

LeetCode240题:搜索二维矩阵II(python3)

代码思路&#xff1a; “根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素&#xff0c;以 matrix 中的左下角元素为标志数 flag &#xff0c;则有: 若 flag > target &#xff0c;则 target 一定在 flag 所在行的上方 &#xff0c;即 flag 所在行可被消去&#xff0c…

day10_日志模块AOP

文章目录 1 记录操作日志1.1 记录日志的意义1.2 日志数据表结构1.3 记录日志思想1.4 切面类环境搭建1.4.1 日志模块创建1.4.2 Log1.4.3 OperatorType1.4.4 LogAspect1.4.5 EnableLogAspect1.4.6 测试日志切面类 1.5 保存日志数据1.5.1 SysOperLog1.5.2 LogAspect1.5.3 AsyncOpe…

springcloud:3.4测试异常熔断降级

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…