目的
最近在玩单片机,发现lvgl需要在代码里面定义图片,而vgl官方提供的是一个在线的转换工具。
这个功能非常简单,简单的用脚本来实现应该更加方便。
注意:
下面的脚本没有经过优化,兼容性也没有考虑。
只是作为一个经过验证的,能够跑通的实例,提供一个思路,仅此而以。
python脚本
依赖opencv
import cv2
import numpy as np
im = cv2.imread("lvgl/demos/widgets/assets/avatar.png", cv2.IMREAD_UNCHANGED) # 保留alpha通道信息
w,h,d = im.shape
print(f"{w=},{h=},{d=}")
with open("demo.c", "w") as f:
f.write("#include \"lvgl.h\"\n\nuint8_t my_img_data[] = {\n")
init = True
for i in range(w):
for j in range(h):
b,g,r,a = im[i,j]
if init:
init = False
f.write(" ")
else:
f.write(",")
f.write(f"{hex(b):>5},{hex(g):>5},{hex(r):>5},{hex(a):>5}")
f.write("\n")
f.write("};\n\n")
s = '''
lv_img_dsc_t my_img_dsc = {
.header.always_zero = 0,
.header.w = %d,
.header.h = %d,
.data_size = %d * %d * %d,
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA, /*Set the color format*/
.data = my_img_data,
};
'''
f.write(s%(w,h,w,h,d))
lvgl中使用该图片
lv_conf.h
#define LV_COLOR_DEPTH 32
test.c
...
LV_IMG_DECLARE(my_img_dsc);
lv_obj_t * icon = lv_img_create(lv_scr_act());
/*From variable*/
lv_img_set_src(icon, &my_img_dsc);
...