Windows 11 微软雅黑 TTC 字体提取为 TTF 教程
一、前言
在 Windows 11 中,微软雅黑通常以 TTC(TrueType Collection)字体集合的形式存在。TTC 文件可以包含多个字体,例如普通微软雅黑和微软雅黑 UI。
在嵌入式 Linux 开发中,如果使用 LVGL + FreeType 动态加载字体,可能希望将 TTC 字体集合提取为独立的 TTF 文件,以便部署和测试。
本文介绍如何使用 Python 的 FontTools 库,从 Windows 11 自带的微软雅黑字体文件中提取指定字体。
开发环境:
- 操作系统:Windows 11
- Python:已安装 Python 环境
- 字体处理工具:FontTools
- 目标平台:RK3506 Linux + LVGL 9.1 + FreeType
二、查找 Windows 系统字体
Windows 系统字体默认存放在:
C:\Windows\Fonts
常见的微软雅黑字体文件包括:
| 文件名 | 说明 |
|---|---|
msyh.ttc |
微软雅黑字体集合 |
msyhbd.ttc |
微软雅黑粗体字体集合 |
msyhl.ttc |
微软雅黑 Light 字体集合 |
可以在 PowerShell 中执行以下命令,查看实际存在的字体文件:
Get-ChildItem C:\Windows\Fonts\msyh*
本文以 msyh.ttc 为例。
三、安装 FontTools
FontTools 是一个用于读取、处理和转换字体文件的 Python 库。
打开 PowerShell,执行:
py -m pip install fonttools
安装完成后,可以通过以下命令检查:
py -m pip show fonttools
如果提示找不到 py 命令,可以尝试使用:
python -m pip install fonttools
四、查看 TTC 文件包含的字体
TTC 文件可能包含多个字体,因此在提取之前,需要先查看字体集合中的字体名称和索引。
在桌面创建 listfonts.py,输入以下代码:
from fontTools.ttLib import TTCollection
ttc = TTCollection(r"C:\Windows\Fonts\msyh.ttc")
for i, font in enumerate(ttc.fonts):
print(i, font["name"].getDebugName(1), font["name"].getDebugName(2))
执行:
cd $HOME\Desktop
py .\listfonts.py
运行结果示例:
0 Microsoft YaHei Regular
1 Microsoft YaHei UI Regular
这说明当前 TTC 文件包含两个字体:
| 索引 | 字体名称 | 说明 |
|---|---|---|
| 0 | Microsoft YaHei Regular | 普通微软雅黑 |
| 1 | Microsoft YaHei UI Regular | 微软雅黑 UI |
如果希望提取普通微软雅黑,可以选择索引 0。
注意:不同 Windows 版本中的字体集合内容可能不同,应以实际查询结果为准。
五、提取 TTC 中的指定字体
在桌面创建 extract_font.py,输入以下代码:
from fontTools.ttLib import TTCollection
ttc = TTCollection(r"C:\Windows\Fonts\msyh.ttc")
font = ttc.fonts[0]
font.flavor = None
font.save(r"C:\Users\75474\Desktop\msyh.ttf")
print("字体提取成功:msyh.ttf")
执行:
py .\extract_font.py
执行成功后,桌面会生成:
C:\Users\75474\Desktop\msyh.ttf
如果需要提取第二个字体,即 Microsoft YaHei UI Regular,可以将:
font = ttc.fonts[0]
改为:
font = ttc.fonts[1]
同时将输出文件名修改为 msyh_ui.ttf。
这里的操作是从 TTC 集合中提取一个字体并保存为独立文件,而不是简单修改文件扩展名。
六、验证提取结果
提取完成后,可以检查文件是否存在:
Get-Item .\msyh.ttf | Select-Object Name, Length
也可以尝试双击 msyh.ttf,使用 Windows 字体预览功能查看字体是否正常。
需要注意,文件成功保存并不代表所有字体特性都一定能被目标平台正确解析。最终仍应在实际使用环境中进行验证。
七、在 RK3506 + LVGL 中使用字体
完成提取后,可以将 msyh.ttf 复制到 RK3506 的文件系统中。
例如,将字体部署到:
/usr/share/fonts/msyh.ttf
然后通过 LVGL 的 FreeType 接口加载字体。
示例代码:
embtool_default_font = lv_freetype_font_create("/usr/share/fonts/msyh.ttf", LV_FREETYPE_FONT_RENDER_MODE_BITMAP, 42, LV_FREETYPE_FONT_STYLE_NORMAL);
参数说明:
| 参数 | 说明 |
|---|---|
| 字体路径 | /usr/share/fonts/msyh.ttf |
| 渲染模式 | 位图渲染 |
| 字号 | 42 px |
| 字体样式 | 常规样式 |
需要确认当前 LVGL 已启用 FreeType 支持,并且运行时能够访问字体文件。
7.1 为什么可以使用 42 px 字号?
LVGL 内置的 Montserrat 字体需要在编译阶段选择对应字号,而 FreeType 可以从字体文件中动态创建指定字号的字体对象。
例如:
lv_freetype_font_create("/usr/share/fonts/msyh.ttf", LV_FREETYPE_FONT_RENDER_MODE_BITMAP, 42, LV_FREETYPE_FONT_STYLE_NORMAL);
这样就可以尝试创建 42 px 的微软雅黑字体,而不需要为了新增一个内置字体字号重新编译 LVGL。
7.2 中文字体部署注意事项
微软雅黑包含大量中文字符,字体文件可能比较大。在嵌入式 Linux 系统中,需要综合考虑:
- 字体文件占用的存储空间。
- FreeType 字体加载和字形缓存占用的内存。
- 界面实际需要显示的汉字范围。
- 字体授权和产品发布要求。
如果设备资源有限,可以考虑使用经过合法授权的字体子集,只保留界面需要的字符。
八、常见问题
8.1 可以直接使用 TTC 吗?
FreeType 支持 TTC 字体集合,并提供通过字体索引选择字体的能力。不过,具体 LVGL FreeType 封装是否暴露字体索引参数,需要以当前版本的接口实现为准。
提取为独立 TTF 后,可以减少对字体集合索引选择的依赖。
8.2 修改扩展名能否完成转换?
不能。将 msyh.ttc 重命名为 msyh.ttf 不会改变字体内部的数据结构。必须使用字体处理工具提取对应字体。
8.3 提取后为什么仍然无法加载?
可以依次检查:
- 字体文件路径是否正确。
- 目标系统是否有读取权限。
- FreeType 是否正常启用。
- LVGL FreeType 扩展是否正确链接。
- 字体文件是否能够被当前 FreeType 版本解析。
- 是否存在内存不足或字体缓存配置问题。
九、总结
本文使用 FontTools 完成了 Windows 11 微软雅黑 TTC 字体集合的检查与提取,生成独立的 TTF 文件,并介绍了在 RK3506 Linux + LVGL + FreeType 中动态加载字体的方法。
对于需要灵活设置字号的嵌入式 GUI 项目,使用 FreeType 从字体文件动态加载字体,可以避免为每个字号单独编译 LVGL 内置字体。
版权与授权提醒: 字体格式转换不会改变原字体的授权条件。微软系统字体的提取、复制、嵌入固件、分发及商业使用,应根据适用的字体许可条款确认是否获得授权。面向公开发布或商业部署的嵌入式产品,也可以考虑使用授权条款明确的开源字体。

浙公网安备 33010602011771号