首页 > 其他分享 >LVGL 中图片使用问题

LVGL 中图片使用问题

时间:2023-01-12 10:25:46浏览次数:47  
标签:lv NULL img jpg LV 使用 LVGL 图片

此笔记主要是记录在 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

标签:lv,NULL,img,jpg,LV,使用,LVGL,图片
From: https://www.cnblogs.com/jzcn/p/17045477.html

相关文章

  • Maui Blazor 使用摄像头实现
    MauiBlazor使用摄像头实现由于MauiBlazor中界面是由WebView渲染,所以再使用Android的摄像头时无法去获取,因为原生的摄像头需要绑定界面组件所以我找到了其他的实现方式......
  • 界面控件DevExtreme中文使用指南——如何在应用中更好的使用图标库?
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......
  • 在 Kubernetes 中部署并使用 KubeEdge
    作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及Kubernetes、KubeSphere、KubeKey等。边缘计算在广泛制造业、工业、零售和金融等行......
  • 把 Eagle App 打造成本地后台管理系统,快速构建 WEB 图片网站。
    自己搭建了图片网站,发现不仅需要前端,还需要后台管理系统,就很烦。偶然之间发现了eagleapp这个软件(专门给设计师管理素材的),经过一番测试,发现了这个好玩的方案。如果你也......
  • android studio 使用备忘
     androidstudio的下载androidstudio下载链接https://developer.android.google.cn/studio历史版本下载链接:https://developer.android.google.cn/studio/archive.ht......
  • elemnet-plus 使用总结
    1.el-date-picker设置起始周的日期备注:如果添加dayjs.en.weekStart=2不起作用需要检查是否添加了el-config-provider语言设置或者在app.vue中添加<template><......
  • Redis-使用备忘
    Redis-使用备忘基本介绍Redis(RemoteDictionaryServer),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并......
  • qt中使用qwt实现实时曲线显示(转)
    QT中使用QWT实现实时曲线显示 最近做一个飞控的上位机,需要实时在一个图中显示多条曲线,并且这些曲线还可以在任何时刻隐藏和显示。于是借鉴qgc地面站中显示mavlin......
  • layui layer 弹窗组件显示图片
    layer弹窗显示表格中的图片。选用layer.photos实例化layer.photos({photos:'#img_'+id,//0-6的选择,指定弹出图片动画类型,默认随机anim:5,});bug点击......
  • 2023-01-11 多头萌发使用中出现的问题
    首先看一下大级别,也就是你做的级别5分钟的大2个级别,也就是4h,4h是铁丝网形态。注意这种形态出现的时候,最好的交易是不交易。   30分钟是一个上升线段。   最......