在ESP32的Lvgl8上使用LvglFontTool显示汉字

本文档详细介绍了如何使用LvglFontTool4.0工具转换字体,并在LVGL图形库中进行修改和应用。首先,介绍了转换字体的步骤,包括选择字体和生成C文件。接着,由于LVGL8的结构体变化,需要修改生成的C文件以适配新版本。具体修改包括创建lv_font_fmt_txt_glyph_cache_t结构体并更新font_dsc。最后,展示了两种使用自定义字体的方法:在canvas上绘制和在label上显示。

一、使用LvglFontTool4.0转换字体

这个工具是阿里兄大佬提供的,他的论坛下载地址
不过由于lvgl8的字体结构体变了一下,最新4.0转换出内部字体的话,需要对生成的c文修改一下才能用
在这里插入图片描述
输入要用到的字,或者直接选加入常用汉字,就看flash够不够大了。
然后选择字体。由于我win10权限的关系,我windows目录里面看不到Font文件夹,需要到控制面板——字体打开Font文件夹,然后将需要的字体文件拷贝到其他地方,才能选择字体
在这里插入图片描述
最后点开始转换,就能生成c文件,存到电脑本地目录

二、修改生成的C文件

因为lvgl8的lv_font_fmt_txt_dsc_t结构体将原来的last_letter和last_glyph_id放到了新的成员cache里面了,所以需要对应改过来

/*Describe store additional data for fonts*/
typedef struct {
   
   
    /*The bitmaps of all glyphs*/
    const uint8_t * glyph_bitmap;
    /*Describe the glyphs*/
    const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc;
    /*Map the glyphs to Unicode characters.
     *Array of `lv_font_cmap_fmt_txt_t` variables*/
    const lv_font_fmt_txt_cmap_t * cmaps;
    /**
     * Store kerning values.
     * Can be  `lv_font_fmt_txt_kern_pair_t *  or `lv_font_kern_classes_fmt_txt_t *`
     * depending on `kern_classes`
     */
    const void * kern_dsc;
    /*Scale kern values in 12.4 format*/
    uint16_t kern_scale;
    /*Number of cmap tables*/
    uint16_t cmap_num       : 9;
    /*Bit per pixel: 1, 2, 3, 4, 8*/
    uint16_t bpp            : 4;
    /*Type of `kern_dsc`*/
    uint16_t kern_classes   
### 显示 JPEG 图像的具体方法 在 ESP32-S3 上使用 LVGL 显示 JPEG 图像需要结合图像解码和 LVGL 的图像显示功能。由于 LVGL 本身不直接支持 JPEG 解码,因此需要先将 JPEG 图像解码为 LVGL 支持的格式(如 RAW、RGB565 等),然后通过 `lv_img_dsc_t` 结构体加载并显示图像。 #### 准备工作 ESP32-S3 具备较大的 PSRAM 容量,适合用于缓存图像数据[^1]。为了实现 JPEG 图像的显示,需确保以下几点: - 已配置好 SPI 接口以驱动 LCD 屏幕。 - 使用 FATFS 或 SD 库访问存储设备中的 JPEG 文件。 - 引入 JPEG 解码库(如 `jpegdec` 或 `JpegDec`)。 - 初始化 LVGL 并设置合适的帧缓冲区。 #### JPEG 解码与图像加载 JPEG 图像需从文件或网络中读取,并解码为 RGB 格式的数据。由于 LVGL 不直接支持 JPEG 编码,必须手动完成解码过程[^3]。例如,可以使用 `JpegDec` 类提供的函数逐行解码图像,并将解码后的像素数据写入内存缓冲区。 ```cpp #include <TFT_eSPI.h> #include <JPEGDecoder.h> TFT_eSPI tft; JpegDec jpeg; void drawJPEG(const char *filename) { File jpegFile = SD.open(filename); if (!jpegFile) return; uint32_t startTime = millis(); if (jpeg.readFile(jpegFile, tft.getSprite())) { while (jpeg.draw()) {} } jpegFile.close(); } ``` #### 配置 LVGL 图像资源 LVGL 使用 `lv_img_dsc_t` 结构来描述图像资源。该结构包含图像宽度、高度、颜色格式以及指向图像数据的指针。JPEG 解码后得到的原始像素数据可赋值给 `.data` 字段,同时指定 `.header.cf` 为 `LV_IMG_CF_RAW` 或 `LV_IMG_CF_TRUE_COLOR` 等合适格式[^3]。 示例代码如下: ```c lv_img_dsc_t img_dsc = { .header.always_zero = 0, .header.w = decoded_width, .header.h = decoded_height, .data_size = decoded_width * decoded_height * 2, // 假设为 RGB565 格式 .header.cf = LV_IMG_CF_RAW, .data = decoded_pixel_data, }; lv_obj_t *img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(img, &img_dsc); lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0); ``` #### 内存管理与性能优化 由于 JPEG 解码会占用大量内存,建议使用 PSRAM 进行缓存。ESP32-S3 支持外部 PSRAM,可通过 `heap_caps_malloc()` 分配带有 `MALLOC_CAP_SPIRAM` 标志的内存空间[^1]。此外,为提高刷新效率,可采用双缓冲机制,在后台解码下一帧的同时前台刷新当前帧。 #### 使用 sjpg 格式提升性能 sjpg 是一种基于标准 JPEG 的自定义图像格式,专为 LVGL 设计。它将一张大图拆分为多个小块进行编码,从而减少内存占用并加快解码速度。转换工具由 LVGL 提供,开发者可使用 Python 脚本将普通 JPEG 转换为 sjpg 格式[^2]。 转换命令示例: ```bash python sjpg_conv.py input.jpg output.sjpg ``` 在 LVGL 中加载 sjpg 图像时,无需额外解码操作,直接调用 `lv_img_set_src()` 即可高效渲染。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值