此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题。最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过程中直接无法看,折腾了一会直接懵逼了,尝试了各种办法都没搞定,后来发现是我没有好好看文档,导致的问题,这里特意记录一下。

一、基本信息

  • lvgl 版本:8.3
  • 使用环境:linux
  • 屏幕大小:480 *800

二、lvgl外部文件使用

为了方便后面的学习,这里先记录一下在 linux 中通过 lvgl 使用外部文件的方式,有需要的可以参考一下,好像其他博主很少特意记录这个问题,我也折腾了好一会

  1. 打开外部文件使用

    lvgl 在8.0后就已经集成了 文件系统的使用,不需要像之前那样进行移植,只需要打开一下对应的配置宏即可。

    打开 LV_USE_FS_POSIX 宏,如下图所示:

    注意:

    • 注意图中的四部分,其中②就是在 linux 中使用外部文件必须要打开的,开启方式如图所示,特别需要注意的是其中的A可以配置成任意字符,这里只是标号,稍后在使用的时候会有介绍。
    • ①部分开启的是在 SD 之类的外设中使用的,比如 STM32 和 esp32 等
    • ③部分开启的是在 windows 中的外设使用。
    • ④部分打开后使用的是通过自定义的文件系统进行使用的。
  2. 使用方式

    使用方式分相对路径和绝对路径,如下所示

    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图片

  1. 通过 JPG 解码器将 JPG 转换为 C 数组

    这里我之前有笔记记录过,所以就不详细介绍了,有需要的可以看看,LVGL 显示图片

  2. 通过转换器将 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);

  3. 直接 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

LVGL 中图片使用问题的更多相关文章

  1. iOS 解决LaunchScreen中图片加载黑屏问题

    iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...

  2. div+css:div中图片垂直居中

    div中图片垂直居中 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  3. iOS相册中图片按照时间排序

    ios相册默认是按照时间从过去到现在排列,图片顺序有正序和逆序,group可以用以下方法来选择顺序 /** @param NSIndexSet 需要获取的相册中图片范围 @param NSEnumer ...

  4. js获取页面中图片的总数

    查看效果:http://keleyi.com/keleyi/phtml/image/9.htm 下面是完整代码: <html><body><div id="ke ...

  5. 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析

    原文:关于Android中图片大小.内存占用与drawable文件夹关系的研究与分析 相关: Android drawable微技巧,你所不知道的drawable的那些细节 经常会有朋友问我这个问题: ...

  6. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  7. IOS中图片拉伸技巧与方法总结(转载)

    以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...

  8. PHP限制HTML内容中图片必须是本站的方法

    本文实例讲述了PHP限制HTML内容中图片必须是本站的方法.分享给大家供大家参考.具体实现方法如下: 1. PHP代码如下: <?php $dom = new DOMDocument; $dom ...

  9. php获取网页中图片并保存到本地

    php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: save_img("http://www.jbxue.com" ?>

  10. KSImageNamed-Xcode-master 对项目中图片提供自动提示功能的插件

    .使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示.  下载地址:http://yun.baidu.com/s/1qWNkvGK  

随机推荐

  1. springboot+redis+虚拟机 springboot连接linux虚拟机中的redis服务

    文章目录 1.前提条件:确保虚拟机开启.并且连接到redis 2.新建立一个springboot项目,创建项目时勾选web选项 3.在pom中引入redis依赖 4.在application.prop ...

  2. C#中的装箱和拆箱

    什么是装箱和拆箱 装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用类型中架起一做桥梁. 换言之,可以轻松的实 ...

  3. SpringBoot3.x原生镜像-Native Image尝鲜

    前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了.在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framewor ...

  4. 现代 CSS 指南 -- at-rule 规则扫盲

    大部分同学都用过 CSS 的屏幕宽度媒体查询,像是这样: @media screen and (min-width: 900px) { div { padding: 1rem 3rem; } } 这里 ...

  5. 京东云开发者|IoT运维 - 如何部署一套高可用K8S集群

    环境 准备工作 配置ansible(deploy 主机执行) # ssh-keygen # for i in 192.168.3.{21..28}; do ssh-copy-id -i ~/.ssh/ ...

  6. Linux备份文件加“时间”命令

    好记性不如烂笔头,好用. date命令用于显示及设置系统的时间或日期,如何设置时间此处不再多说. date命令非常强大,可以将数据备份命令与date命令结合在一起使用,可以便捷的分辨出每个文件的备份时 ...

  7. 【Docker】容器使用规范--安全挂载建议

    容器挂载过程和安全挂载建议 绑定挂载 本文所提到的挂载主要指绑定挂载(bind mount),即通过-v /xx/xx:/xx/xx 和 --mount type=bind,xxx,xxx两种方式设置 ...

  8. Crond服务+Shell实现秒级任务

    服务 [root@19-v1-centos-6 ~]# chkconfig --list | grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:of ...

  9. 【collection】1.java容器之HashMap&LinkedHashMap&Hashtable

    Map源码剖析 HashMap&LinkedHashMap&Hashtable hashMap默认的阈值是0.75 HashMap put操作 put操作涉及3种结构,普通node节点 ...

  10. 第一章:seaborn图形美学

    一.seaborn模板 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 def sinplot(flip=1): 5 x = np ...