1. 为什么需要定制U8G2中文字体
嵌入式开发中经常遇到一个头疼的问题:如何在有限的硬件资源下优雅地显示中文。U8G2作为嵌入式图形库的佼佼者,虽然自带英文字体支持,但对中文的支持却需要开发者自己动手。这就像给你一套精美的西餐餐具,却要你自己打造筷子来吃中餐。
我遇到过最典型的场景是在128x64的OLED屏上显示产品参数。系统自带的英文字体很漂亮,但一到中文就变成乱码。最初尝试过外挂字库芯片的方案,不仅增加了BOM成本,读取速度还慢得让人抓狂。后来发现U8G2其实支持BDF点阵字体,这才打开了新世界的大门。
BDF字体就像乐高积木,每个字都是固定大小的像素块。它的优势在于:
- 资源占用可控:只包含需要的字符,不像TTF那样包含全套字库
- 渲染速度快:不需要实时计算矢量轮廓
- 兼容性好:U8G2原生支持BDF转换后的C代码
但直接使用现成的BDF字体往往不合适。比如文泉驿的9pt字体包含6000+常用汉字,实际项目可能只需要几十个特定字符(如"温度"、"湿度"等)。这就好比带着整个工具箱出门,其实只需要一把螺丝刀。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字体转换的核心原理与工具选型
2.1 TTF与BDF的本质区别
TTF就像用数学公式描述的矢量图,可以无限缩放而不失真。BDF则是固定分辨率的像素图,放大后会出现锯齿。这就解释了为什么直接转换会有毛边问题——矢量到点阵的采样过程就像用网格临摹一幅画,细节必然丢失。
在技术实现上:
- TTF使用贝塞尔曲线定义字形轮廓
- BDF用二进制矩阵记录每个像素的开关状态
- 转换过程本质是栅格化(Rasterization)
2.2 工具链的选择与优化
经过多次踩坑,我最终选定了Easy-u8g2-font-generate-tools这个Python工具。原版工具已经三年没更新,存在几个痛点:
- 字符输入方式单一(只能手动输入)
- 文件选择不够直观
- 强制TTF→BDF转换流程
我的改进版主要做了这些优化:
- 增加文本文件导入功能(把需要的字写在txt里)
- 可视化文件选择器
- 支持直接使用现有BDF字体
- 去除影响显示的ANSI颜色代码
安装非常简单:
bash复制git clone https://gitee.com/etberzin/Easy
