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 提取后为什么仍然无法加载?

可以依次检查:

  1. 字体文件路径是否正确。
  2. 目标系统是否有读取权限。
  3. FreeType 是否正常启用。
  4. LVGL FreeType 扩展是否正确链接。
  5. 字体文件是否能够被当前 FreeType 版本解析。
  6. 是否存在内存不足或字体缓存配置问题。

九、总结

本文使用 FontTools 完成了 Windows 11 微软雅黑 TTC 字体集合的检查与提取,生成独立的 TTF 文件,并介绍了在 RK3506 Linux + LVGL + FreeType 中动态加载字体的方法。

对于需要灵活设置字号的嵌入式 GUI 项目,使用 FreeType 从字体文件动态加载字体,可以避免为每个字号单独编译 LVGL 内置字体。

版权与授权提醒: 字体格式转换不会改变原字体的授权条件。微软系统字体的提取、复制、嵌入固件、分发及商业使用,应根据适用的字体许可条款确认是否获得授权。面向公开发布或商业部署的嵌入式产品,也可以考虑使用授权条款明确的开源字体。

posted @ 2026-10-15 08:43  上善若淼  阅读(74)  评论(0)    收藏  举报