LVGL字体实战:如何用lv_font在嵌入式设备上显示中文(附图标字体教程)

LVGL显示中文字体 注意:这里有坑,这里的“你好”两个字可能无法正常显示对于LVGL来说使用的是UTF-8格式,所以在移植时要注意,代码的显示格式,例如在keil中要修改编码格式,输入中文你好才可以显示。在lvgl中是没有直接中文显示的的字体文件,需要我们自己制作并且导入。芯片内存小的话也是放不下的所以建议使用symbols生成这个项目中所需要的字体即可。点击生成即可 这里注意你生成的文件是很大的需要等一会,如果全部生成的话,你的。大家可以在韦东山老师的官网下载字体文件。注意我这里由于文件过大,所以重新生成了一个小的文件。 阅读详情

LVGL字体实战:如何用lv_font在嵌入式设备上显示中文(附图标字体教程)

最近在做一个智能家居中控屏的项目,UI框架选用了LVGL,功能跑起来都挺顺,直到产品经理要求在界面上显示“温度:25℃”和“客厅”这几个中文。我像往常一样用lv_label_set_text设置,结果屏幕上要么是空白,要么是一堆乱码。那一刻我才意识到,在嵌入式世界里,让一块小小的屏幕“说中文”,远没有在电脑上打几个字那么简单。这不仅仅是编码问题,还涉及到字体文件从哪里来、怎么放进去、会不会把宝贵的Flash空间撑爆等一系列现实挑战。如果你也正在LVGL项目中为中文显示头疼,或者想优雅地使用图标字体来美化界面,那么这篇从实际项目里摸爬滚打总结出来的经验,或许能帮你少走些弯路。

1. 理解核心:LVGL字体系统是如何工作的

在动手解决中文显示之前,我们得先搞明白LVGL的字体系统到底在干什么。这能帮你理解后续所有操作背后的逻辑,而不是机械地照搬步骤。

简单来说,LVGL的字体渲染是一个“查字典”的过程。当你调用lv_label_set_text(label, “你好”)时,LVGL会遍历字符串中的每一个Unicode字符(比如“你”字的Unicode码点是U+4F60),然后去当前标签所关联的字体“字典”里查找这个码点对应的“字形描述”。这个描述,就是我们通过工具生成的.c文件里那一大堆数组数据,它精确地定义了每个像素点是黑是白(对于1bpp)或是灰度等级(对于抗锯齿字体)。

这里有几个关键概念直接影响你的选择和后续操作:

  • bpp (Bits Per Pixel): 这决定了字体的“细腻”程度。1bpp就是纯粹的黑白,没有灰色过渡,边缘会有明显的锯齿感。4bpp则意味着每个像素可以用16个灰度等级来表示,从而实现平滑的抗锯齿效果。数值越高,显示效果越好,但每个字符占用的存储空间也成倍增加。对于大多数彩色LCD屏,4bpp是效果和资源消耗的甜蜜点。
  • 字体范围 (Range): 这是字体生成工具里最重要的设置之一。你不可能、也不应该把整个GB2312或GBK字符集(六七千个字)全部打包进固件。你需要根据产品实际用到的文字,精确地指定一个字符范围。比如,你的UI只显示“设置”、“返回”、“温度”、“湿度”等几十个固定词汇,那么只生成这些字即可,能节省大量空间。
  • 字体文件格式: LVGL不直接使用.ttf或.otf这类桌面系统常见的字体文件。它需要一种高度优化、适合嵌入式系统直接访问的格式——即C语言源文件(.c和.h)。生成工具的工作,就是将.ttf中的特定字符,按照指定的bpp和尺寸,转换成两个巨大的静态数组(glyph_bitmap存储像素数据,glyph_dsc存储字符的度量信息),并封装成可直接编译的C模块。

注意:LVGL v7.x及以后版本移除了对8bpp抗锯齿的支持,主要因为其资源消耗与显示提升不成正比。所以现在通常只在1bpp、2bpp、4bpp之间选择。

理解了这个“查字典”模型,你就会明白,所谓“显示中文”,本质上就是:1)制作一本包含所需中文字符的“字典”(字体C文件);2)告诉LVGL去使用这本“字典”(声明并引用字体);3)确保你传递的字符串和“字典”的索引方式能对上(UTF-8编码)。

2. 手把手生成你的第一个中文字体文件

理论清楚了,我们进入实战环节。我将以目前最常用的LVGL官方在线字体转换工具为例,演示如何生成一个包含特定中文和符号的字体文件。

第一步:准备与访问工具 你需要一个TrueType格式(.ttf)的字体文件作为源。系统自带的字体通常有版权限制,用于商业产品需谨慎。这里我们可以使用开源免费的字体,例如“思源黑体”(Source Han Sans)。你可以从开源字体仓库获取其.ttf文件。 工具地址是:https://lvgl.io/tools/font-converter。这是一个网页工具,无需安装,但需要联网。

第二步:配置关键参数 打开网页后,你

LVGL笔记9--lv_font字体 LVGL笔记9–lv_font字体 LV_font简介 ​ LVGL支持的字体有很多,而且有很好的抗锯齿特性,常用的是1bpp\2bpp\4bpp,旧版本最高支持8bpp抗锯齿,但是在新版本已经不在支持了,选择的bpp值越大,消耗的flash资源越多,通常使用4bpp就能达到非常好的显示效果,使用1bpp表示不进行抗锯齿,bpp值在生成字体时就要选择好,在使用中应根据硬件平台实际性能进行选择。littleVGL支持UTF-8编码,可以实现全球所有的字符显示,而且还支持“图标字体”。 LVGL支持的编码 ​ 阅读详情

相关推荐

告别乱码!手把手教你用阿里妈妈数黑体+LVGL 8.3打造炫酷中文界面(附图标字体生成全流程)

本文详细介绍了如何利用阿里妈妈数黑体和LVGL 8.3打造嵌入式设备的中文界面,解决乱码问题并实现炫酷效果。通过字体子集化、图标字体生成等技巧,大幅降低内存占用,提升显示质量。文章包含从字体选型到高级性能调优的全流程实战指南,特别适合智能家居、工业HMI等嵌入式开发场景。

weixin_29007243的博客 315

LVGL font 字库管理(lv_font.c)

LVGL框架中对于字库提供了三个接口(在`lvgl/src/font/lv_font.c`中)用于获取字的图片、字的信息及查询字的宽度。在这三个接口之下,提供了两种字库解决方案:内置字库和外挂字库(freetype)。

Bigan(安)的博客 3106

Langfuse实战:从评估打分到问题解决的完整指南

本文详细介绍了如何利用开源LLM工程平台Langfuse对AI应用进行系统性评估与优化。从创建评估数据集、设计自动化评分函数,到深入排查常见问题并关联Trace进行精准打分,提供了完整的实战指南。最后,探讨了如何利用评估结果驱动提示词迭代与A/B测试,并给出了生产环境部署与性能优化的关键考量,帮助开发者构建可测量、可分析、可改进的LLM应用。

backprop5master的博客 651

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6009

drm 之modes

#define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <time.h&...

u012794472的专栏 3720

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 540

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

cartographer如何使用2个反光柱子作为一个landmark

2个反光柱的摆放要求:靠着墙摆,因为我们只能从一侧看到2个反光柱,从两侧都看到至少需要3个反光柱来定位。 landmark检测原理:因为我们是从一侧看到2个反光柱,所以看到2个反光柱在一帧激光数据中会有顺序,有2种情形,如下图 这两种情形,我们发现 情形1: 这种情形2个反光柱子被检测到的激光角度小于180,我们认为大一些激光角度的是原点。 情形2: 这种情形2个反光柱子被检测到的激光角度大于180,我们认为小一些激光角度的是原点。 这样原点就固定下来,并是唯一的。2个反光柱构成的坐标系也就确定了。和激光坐

南北粉面馆 3827

【目标检测-YOLO】YOLOv5-v5.0-yolov5s网络架构详解(第一篇)

源码:GitHub - ultralytics/yolov5 at v5.0 由于YOLO v5 代码库在持续更新,如上图,有多个版本,每个版本的网络结构不尽相同。以下内容以 v5.0 为准,网络结构选用 yolov5s。 为了方便画图和理解网络结构,选用可视化工具:Netron 网页版进行可视化, 然后使用PPT作图。 在Releases · ultralytics/yolov5 · GitHub找到 v5.0中的Assets 中的yolov5s.pt并下载该权重。 下图为直接......

博观约取,厚积薄发 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: B863AV3.2-M vs E900V22C:哪款电视盒子更适合刷机?实测对比与固件推荐
下一篇: BugKu靶场实战:从弱口令到内网渗透的完整通关指南(附Pikachu靶场配置)
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值