一、图片存储

我们可以将图像存储在两个位置

  • 作为内部存储器(RAM或ROM)中的变量
  • 作为文件

图片以文件的形式存储在文件系中(比如SD),需要打开LVGL的文件操作的功能(打开,读取,关闭等)。虽然以文件的形式存储时,在绘制图形之前必须将其读取到RAM中,不像变量那样对资源友好,但是更容易替换,而无需重新编译主程序。

这里主要分析以变量的形式进行存储。

二、图像变量

图像的变量如下所示:

uint8_t my_img_data[] = {0x00, 0x01, 0x02, ...};

static lv_img_dsc_t my_img_dsc = {
.header.always_zero = 0,
.header.w = 80,
.header.h = 60,
.data_size = 80 * 60 * LV_COLOR_DEPTH / 8,
.header.cf = LV_IMG_CF_TRUE_COLOR, /*设置颜色格式*/
.data = my_img_data,
};
  1. header.always_zero: 它是第一个字节的高位。始终为零

  2. header.w: 宽度(以像素为单位)(<= 2048)

  3. header.h: 高度(以像素为单位)(<= 2048)

  4. header.reserved: 保留供以后使用

  5. header.cf: 是颜色格式(详细稍后分析)

    • LV_IMG_CF_TRUE_COLOR 只需存储RGB颜色(使用LVGL配置的任何颜色深度)。
    • LV_IMG_CF_TRUE_COLOR_ALPHA 与LV_IMG_CF_TRUE_COLOR类似,但它还会为每个像素添加一个alpha(透明度)字节。
    • LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED 与LV_IMG_CF_TRUE_COLOR类似,但是如果像素具有LV_COLOR_TRANSP(在 lv_conf.h中设置)颜色,则该像素将是透明的。
    • LV_IMG_CF_INDEXED_1/2/4/8BIT 使用2、4、16或256色调色板,并以1、2、4或8位存储每个像素。
    • LV_IMG_CF_ALPHA_1/2/4/8BIT 仅将Alpha值存储在1、2、4或8位上。 像素采用style.image.color和设置的不透明度的颜色。源图像必须是Alpha通道。这对于类似于字体的位图是理想的(整个图像是一种颜色,但是您希望能够更改它)。

6 data: 指向图像数据的指针

三、颜色格式

LV_IMG_CF_TRUE_COLOR图像的字节按以下顺序存储。

  1. 对于32位色深:

    • Byte 0: 蓝色(Blue)
    • Byte 1: 绿色(Green)
    • Byte 2: 红色(Red)
    • Byte 3: 透明度(Alpha)
  2. 对于16位色深:

    • Byte 0: 绿色(Green )3位低位,蓝色(Blue)5位
    • Byte 1: 红色(Red)5位,绿色(Green )3位
    • Byte 2: 透明度(Alpha)字节(仅适用于LV_IMG_CF_TRUE_COLOR_ALPHA)
  3. 对于8位色深:

    • Byte 0: 红色(Red)3位, 绿色(Green )3位, 蓝色(Blue)2位
    • Byte 2: 透明度(Alpha)字节(仅适用于 LV_IMG_CF_TRUE_COLOR_ALPHA)
  4. Raw格式:

    我们可以将图像以Raw格式存储,以指示它不是内置的颜色格式,并且需要使用外部Image解码器来解码图像。

    • LV_IMG_CF_RAW 表示基本的原始图像(例如PNG或JPG图像)。
    • LV_IMG_CF_RAW_ALPHA 表示图像具有Alpha,并且为每个像素添加了Alpha字节。
    • LV_IMG_CF_RAW_CHROME_KEYED 表示该图像已按chrome键锁定,如上文LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED中所述。

四、添加图像

了解完上面图像变化后,添加图像就比较简单了,这里有两种方式

  • 手动创建图像

    根据上面的图像变量和颜色格式变可以创建一张新的图像,像是这样操作就比较麻烦了

  • 图片生成变量

    这样就比较简单了,可以使用LVGL官方提供的在线转换器,直接将图片转换成图像变量,便可直接导入程序中使用

图像转换

  1. 在线转换器

    LVGL 在线转换器:https://lvgl.io/tools/imageconverter

  2. 将图像转为.c文件

  3. 将生成的.c文件拷贝到工程中

五、图片使用

在使用图片之前,需要使用LV_IMG_DECLARE对图片进行声明

LV_IMG_DECLARE(img_test);

测试程序

#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif LV_IMG_DECLARE(img_test); void lvgl_gui_test(void)
{
lv_obj_t * img1 = lv_img_create(lv_scr_act());
lv_img_set_src(img1, &img_test);
lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_size(img1, 80, 40);
}

LVGL 显示图片的更多相关文章

  1. LVGL 中图片使用问题

    此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题.最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过 ...

  2. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  3. python将图片转换为Framebuffer裸数据格式(终端显示图片)

    要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显 ...

  4. Chrome 控制台新玩法-console显示图片以及为文字加样式

    有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.lo ...

  5. 如何使用SOIL在VS2012的 C++环境下显示图片

    先看下效果. 这是一个很无聊的功能....首先说下,我做这个功能的初衷并不是为了实现在控制台中显示图片...(这貌似很无聊) 而是因为自己想做用C做一个游戏:http://q.cnblogs.com/ ...

  6. Qt自适应大小显示图片,添加菜单

    由于后面的图像处理需要UI,OpenCV自带也不怎么会,MFC实在懒得学的.听同学说Qt不错,就用Qt做UI了. 本文主要介绍三个内容:在Qt Creator中使用OpenCV2.Qt中自适应显示图片 ...

  7. EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox显示图片连续刷新出现闪烁问题

    在上一篇里,EmguCV(OpenCV)实现高效显示汉字及叠加  实现了视频叠加及显示,但存在问题,就是 Emgu.CV.UI.ImageBox及C# picturebox显示图片时都会出现闪烁,尤其 ...

  8. 显示图片的(自定义)吐司Toast

    一般我们提示的时候都是直接提示文字的,其实Toast也可以显示图片 常用方法 Toast.makeText(context,text,duration)这返回一个Toast对象 toast.setDu ...

  9. python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  10. 【OpenCV练习】简单显示图片的代码

    今天依照网上的教程尝试了一下最基本的图片显示. 首先想说一下编译时出现的问题,开始时在编译时会出现无法识别cvReleaseImage的情况,是因为没有在配置中包含相应的core的库文件. 加进去就解 ...

随机推荐

  1. 并发CPU伪共享及优化

    伪共享 缓存系统中是以缓存行(cache line)为单位存储的.缓存行是2的整数幂个连续字节,一般为32-256个字节.最常见的缓存行大小是64个字节.当多线程修改互相独立的变量时,如果这些变量共享 ...

  2. #根号分治,树上倍增#洛谷 3591 [POI2015]ODW

    题目 分析 考虑直接用倍增跳会TLE,设\(f[x][i]\)表示以\(x\)为起点每次跳\(i\)步的点权和, 这可以预处理出来,综合一下两种做法,当\(i>\sqrt{n}\)时直接上倍增, ...

  3. MySQL 主从 AUTO_INCREMENT 不一致问题分析

    作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换, ...

  4. 使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

    错误详情:使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' ...

  5. C语言 02 安装

    C 语言的编译器有很多,其中最常用的是 GCC,这里以安装 GCC 为例. Windows 这里以 Windows 11 为例 官方下载地址:https://www.mingw-w64.org/ 选择 ...

  6. MCM箱模型建模方法及大气O3来源解析

    OBM箱模型可用于模拟光化学污染的发生.演变过程,研究臭氧的生成机制和进行敏感性分析,探讨前体物的排放对光化学污染的影响.箱模型通常由化学机理.物理过程.初始条件.输入和输出模块构成,化学机理是其核心 ...

  7. k8s之configmap应用

    一.创建configmap 1.基于命令创建configmap root@k8s-master01:~# kubectl create configmap demoapp-cfg --from-lit ...

  8. Blocks(单调栈)

    题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列. 这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了. 接下来就是找 ...

  9. Android 开发入门(3)

    0x05 活动 Activity (1)启停活动页面 a. 启动和结束 从当前页面跳转至新页面 startActivity(new Intent(this, [targetPage].class)) ...

  10. wandb一个简单demo

    wandb绘制曲线:sin函数,cos函数,log函数. wandb绘制本地图片 wandb绘制matplotlib图片 wandb绘制numpy图片 import math import wandb ...