【esp32&lvgl】-2.3 #lvgl-图片

目录

一、前言

二、c文件

三、bin文件

四、解码库

参考资料


一、前言

lvgl插入图片的方法主要有三种:

  1. 将图片利用工具生成c文件,写入单片机程序并进行烧录,这种方式实现起来较为简单,但是由于硬件限制,图片的大小会受限,且占用内存,可以用在加载界面等地方。
  2. 将图片利用工具生成bin文件用lvgl的文件系统访问
  3. 通过图片解码库利用lvgl的文件系统访

二、c文件

        首先将所需的图片进行初步处理,通过ps简单调整一下图片的像素尺寸。像素较大的图片转化为c文件一个是转化速度慢,另一个单片机的内存有限烧录不进去。这里推荐调整为自己的屏幕尺寸大小左右(长宽100像素左右)。

图一-调整图片像素

 然后就可以开始进行图片的转化,一般有两种方式:

  1. 通过官方的在线工具转换
  2. 下载大佬的离线转换工具

        我这里是测试一下,用官方的在线工具转换即可(大佬的离线工具有一些批量转换之类的功能,比官方的要好用一些),设置可以看下图。其中color format可以导出不同类型的数据,选择带alpha词条的类型会多出透明度的设定,选择chroma词条的类型可以让图片一些固定颜色的部分不显示这里就用一般的CF_COLOR_TRUE格式即可。

图二-图片在线转换设定

         导出c文件后放到项目的代码里,记得在cmake文件里编译一下,然后代码里就可以引用,文件里自己会带一个变量,与导出时设定的文件名一致。然后通过lv代码就可以调用图片了。这里简单贴一下我的代码画图部分,代码的其他部分可以看前一篇文章,就把界面绘制的部分替换一下就行。

这里简单说两个函数:

  • lv_img_set_zoom—调整图片的大小(函数值255是100%大小,128是50%).
  • lv_obj_set_style_bg_opa——调整背景的透明度,测试一下0是完全不透明,255是完全透明(底色是白色)。
void gui_test(){
    lv_obj_t *scr = lv_scr_act();
    lv_obj_clean(scr);

    lv_obj_remove_style_all(scr);
    lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 255);
    lv_obj_set_style_bg_color(scr, lv_color_black(), 0);

    LV_IMG_DECLARE(tju);
    lv_obj_t *img1 = lv_img_create(scr);
    lv_img_set_src(img1, &tju);
    lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);
    lv_img_set_zoom(img1,255);
}
图三-cmake文件里的设置

 至此,图片已经在屏幕上成功显示出来了。

图四-c图片显示成功

三、bin文件

        bin图片的加载与c文件相比,首先需要进行文件系统的加载,加载完文件系统后,只需要将bin图片放在sd卡内然后对gui_test函数稍作修改即可:

    lv_obj_t *scr = lv_scr_act();
    lv_obj_clean(scr);

    lv_obj_remove_style_all(scr);
    lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0);//0不透明
    lv_obj_set_style_bg_color(scr, lv_color_black(), 0);

    //LV_IMG_DECLARE(tju);
    lv_obj_t *img1 = lv_img_create(scr);
    lv_img_set_src(img1,"S:/image/tju_120.bin");
    lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);
    //lv_img_set_zoom(img1,255);

        如上所示,将LV_IMG_DECLARE这一声明图片的语句注释掉,然后将图片更换为图片在内存卡中的路径即可。

        值得注意的是,bin文件是不能修改显示的大小的,lv_img_set_zoom函数会使图片无法显示,记得将图片修改为合适大小的像素进行显示(经过测试如果图片较大,会显示图片的一部分充满屏幕,而且会加载的比较慢)。

而其他的图片调整函数是否会引起这一问题还没有进行测试(如旋转等),之后测试完也贴在这:

todo

除此之外,图片就可以在屏幕上正常显示了:

图四-bin图片显示成功

四、解码库

        todo

LVGL V8 图片解码库移植 - 哔哩哔哩 (bilibili.com)

参考资料

Images — LVGL documentation (100ask.net)

Online image converter - BMP, JPG or PNG to C array or binary | LVGL

LVGL库入门教程 - 动画 - 冰封残烛 - 博客园 (cnblogs.com)

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32 ESP-IDF LVGL 是一种用于嵌入式系统的开发框架,LVGL 则是一个用于创建嵌入式图形界面的开源图形库。关于视频流的处理,可以通过调用 ESP-IDF 中的函数来实现。在这个项目中,作者使用了 JPEG 流封装 AVI 视频的方法,将实时读取的图片写入 AVI 文件,并保存到 SD 卡中。通过调用相关函数,如 `jpeg2avi_start`、`jpeg2avi_add_frame` 和 `jpeg2avi_end`,可以实现将一帧帧的图片构成的视频保存下来。这个方法结合了作者原理的讲解和详细的代码示例,非常值得参考和感谢作者原野追逐的贡献。在这个项目中,ESP32 通过 LVGL 图形库提供的界面,可以实时读取摄像头数据,并将视频流传输到网页上,同时将读取的图片写入 SD 卡中的 AVI 文件中。然而,由于 ESP32 的处理能力有限,同时完成读取摄像头数据、传输到网页、写入 SD 卡这三个功能对其来说是一项挑战。在测试中,视频流的帧率较低,不够流畅。因此,需要进行性能优化或者考虑其他解决方案来改善视频流的流畅度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)](https://blog.csdn.net/hwd00001/article/details/126679619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值