4、图片转换工具入门:LVGL官方图片转换器安装与配置

做嵌入式GUI开发,免不了要和图片打交道。你想想看,一张漂亮的PNG背景图,在单片机上跑不起来——MCU不认识PNG,它只认二进制像素数组。所以,图片转换是LVGL移植里绕不开的一步。

LVGL官方提供了一个命令行工具,叫LVGL Image Converter(简称LvglImageConverter)。说白了,它就是把你的PNG、JPG、BMP,转成LVGL能吃的C语言数组,或者直接生成二进制字体/图片文件。我最早做LVGL项目时,手动用Python脚本转图片,后来发现官方工具已经做得很成熟了,就彻底换了过来。

一句话总结:这个工具是LVGL图片资源的“翻译官”,把通用图片格式翻译成MCU能理解的格式。

4.1 工具能做什么?

先搞清楚它的能力边界,免得后面走弯路。LvglImageConverter支持以下几种输出格式:

输出格式 说明 典型场景
C Array 生成C语言字节数组,直接编译进固件 小图标、启动Logo、固定背景图
Binary 生成二进制文件,存储在外部Flash或SD卡 大图、多语言字库、动态加载的图片
Font 将图片转为LVGL字体格式(配合字体工具) 图标字体、自定义符号
LVGL Image 生成.lvgl格式,用于LVGL模拟器或在线工具 原型验证、跨平台调试

我个人最常用的是C Array和Binary。小图直接编译进代码,大图放外部存储,这样内存压力小很多。

4.2 安装方式

这个工具基于Node.js,所以安装前你得先准备好Node环境。如果你还没装Node.js,去官网下载LTS版本就行,一路Next搞定。

4.2.1 全局安装(推荐)

打开终端,敲下面这行命令:

npm install -g @lvgl/image-converter

安装完成后,验证一下:

lvgl-image-converter --version

如果能看到版本号,比如v1.3.0,说明装好了。我记得第一次装的时候,终端报了个权限错误,后来加了个sudo(Linux/Mac)就解决了。Windows用户记得用管理员身份运行CMD。

小提示:如果你在公司内网,npm可能连不上。可以设置淘宝镜像:npm config set registry https://registry.npmmirror.com,速度会快很多。

4.2.2 局部安装(项目级)

如果你不想全局装,也可以把工具放在项目里:

npm install --save-dev @lvgl/image-converter

然后通过npx调用:

npx lvgl-image-converter --help

这种方式的好处是,团队协作时每个人都能用同一个版本,避免“我机器上能跑,你机器上不行”的尴尬。

4.3 核心配置参数

工具装好了,怎么用?核心就一条命令,配上几个参数。我挑几个最常用的给你讲讲。

4.3.1 基本命令结构

lvgl-image-converter -i input.png -o output.c -f C_ARRAY -c CF_INDEXED_4_BIT

参数说明:

参数 缩写 说明 示例值
--input -i 输入图片路径 ./images/logo.png
--output -o 输出文件路径 ./output/logo.c
--format -f 输出格式 C_ARRAY, BINARY, FONT
--color-format -c 颜色格式 CF_TRUE_COLOR, CF_INDEXED_4_BIT
--output-format -of 输出文件格式(配合Binary) BIN, HEX

4.3.2 颜色格式怎么选?

这是最容易踩坑的地方。颜色格式决定了图片在MCU上的内存占用和显示效果。

  • CF_TRUE_COLOR:32位真彩色,效果最好,但一张320x240的图就要300KB。如果你的MCU有外部RAM,可以考虑。
  • CF_INDEXED_4_BIT:4位索引色,16种颜色。适合图标、按钮等颜色少的图。内存只有真彩色的1/8。
  • CF_INDEXED_8_BIT:8位索引色,256种颜色。折中方案,适合照片类图片。
  • CF_ALPHA_8_BIT:8位透明度通道。适合做遮罩、阴影效果。
注意:我曾经在项目里用CF_TRUE_COLOR转了一张800x480的背景图,结果编译后固件直接超了Flash容量。后来换成CF_INDEXED_8_BIT,图片从1.5MB缩到400KB,显示效果肉眼看不出差别。所以,先评估你的硬件资源,再选颜色格式。

4.4 实战:转一张图片试试

光说不练假把式。我们拿一张128x128的PNG图标,转成C数组。

第一步,准备图片。确保图片尺寸是2的倍数(LVGL要求),最好是正方形。

第二步,执行命令:

lvgl-image-converter -i icon_settings.png -o icon_settings.c -f C_ARRAY -c CF_INDEXED_4_BIT

第三步,查看输出。你会得到一个icon_settings.c文件,里面包含:

  • 一个LV_IMG_DECLARE宏
  • 图片宽高、颜色格式描述
  • 像素数据数组

第四步,在LVGL代码里引用:

#include "icon_settings.c"

lv_obj_t *img = lv_img_create(lv_scr_act());
lv_img_set_src(img, &icon_settings);
lv_obj_center(img);

编译下载,图标就显示出来了。是不是很简单?

4.5 避坑指南

我踩过的坑,你就不用再踩了。这里列几个常见问题:

  • 图片尺寸不对:LVGL要求图片宽高都是2的倍数。如果你转了张奇数尺寸的图,显示会花屏。解决办法:用PS或GIMP先把图片缩放到偶数尺寸。
  • 颜色格式不匹配:如果你的屏幕是16位色(RGB565),却用了CF_TRUE_COLOR,LVGL会自动转换,但会多消耗CPU。建议直接匹配屏幕色深。
  • 路径带中文:工具对中文路径支持不好。我曾经把图片放在“桌面/项目图片”文件夹下,结果死活转不出来。后来改成纯英文路径,一次通过。
  • Node版本太低:工具要求Node.js 14+。如果你还在用Node 12,升级一下吧。
我的习惯:在项目根目录建一个scripts/convert_images.sh脚本,把所有图片的转换命令写进去。这样每次更新图片,跑一遍脚本就行,不用一条条敲命令。

4.6 知识体系一览

下面这张图帮你理清本章的核心逻辑:

LVGL Image Converter 知识体系 输入图片 PNG / JPG / BMP LVGL Image Converter npm install -g @lvgl/image-converter C Array 编译进固件 Binary 外部存储 Font / LVGL Image 图标字体 / 模拟器 核心配置参数 -i 输入路径 | -o 输出路径 | -f 输出格式 | -c 颜色格式 CF_TRUE_COLOR / CF_INDEXED_4_BIT / CF_INDEXED_8_BIT / CF_ALPHA_8_BIT

从这张图可以看得很清楚:输入图片经过转换器,根据你选的格式和颜色配置,输出不同的文件类型。每个环节都有对应的参数控制,理解了这张图,你就掌握了工具的核心用法。

4.7 小结

这一章我们搞定了LVGL Image Converter的安装和基本配置。你学会了:

  • 工具能输出哪些格式
  • 怎么安装(全局和局部两种方式)
  • 核心参数怎么用
  • 颜色格式怎么选
  • 实际转一张图片的完整流程

工具装好了,下一件事就是批量处理项目里的所有图片资源。别急,后面我们会讲怎么用脚本自动化搞定这件事。现在,先动手转一张你自己的图片试试吧。