Py_FontMaker 在线生成 研究笔记 方案详解
← 返回生成页

嵌入式点阵字库:从零到跑通

Py_FontMaker 完全文档(教程 + 参考手册)—— 原理、生成、参数、集成、变形文字与多语言,照着做即可。
免费使用Web 免安装LVGL v8/v9 + 裸机18 种变形语言
赶时间?直接跳 第 2 章,五分钟生成你的第一个字库; 遇到问题查 第 9 章排错手册。本文不需要任何前置知识。

1三分钟看懂点阵字库

电脑和手机上的字体文件(TTF/OTF)存的是矢量轮廓——每个字是一组贝塞尔曲线, 显示时由 FreeType 这样的引擎实时"画"出来。这需要相当的 CPU 和内存,小型嵌入式设备(手表、仪表、 家电面板)跑不动,也没必要跑。

嵌入式的做法是预先把每个字"画"成小图片——点阵位图,存进 Flash; 显示时按编号查出来贴到屏幕上即可,查表 + 拷贝,任何单片机都能轻松胜任。这个"把字体变成点阵图集合"的 过程就是字库生成,Py_FontMaker 干的就是这件事:

总体方案架构
整体流程:PC 端把 TTF 栅格化打包,设备端查表渲染

两个马上会遇到的概念

概念一句话解释怎么选
bpp(灰度位深) 每个像素用几个 bit 表示。1bpp 非黑即白有锯齿;2/4bpp 有灰度过渡,边缘平滑(抗锯齿);8bpp 最细腻 彩屏选 2bpp(大小与效果的最佳平衡);墨水屏/单色屏选 1bpp;追求极致选 4bpp
字号(像素) 字的高度,直接按屏幕像素理解,如 24 就是 24 像素高的字 看你的屏幕分辨率与 UI 设计稿;常用 16/24/32
字形渲染流程
一个字从 TTF 到屏幕像素的旅程

这套方案带来的效果

指标效果
内部 Flash 占用仅引擎(~2 KB) + 稀疏 cmap 表 + 兜底字库,字库本体 0 占用(放外挂 Flash)
RAM 占用1~2 个字形缓冲(几百字节) + 100 条描述缓存,与字库大小无关
字库升级bin 与固件用随机版本号配对,字库可独立 OTA;版本不匹配自动落兜底字库不花屏
接口LVGL v8 / v9 官方版自动适配,也提供裸机回调;一个宏切换

2五分钟跑通第一个字库

不需要安装任何软件,打开 pyfontmaker.com 即可。

第 0 步:先玩一下实时预览(可选但推荐)

首页顶部"⚡ LVGL 模拟器实时预览"里输入或粘贴任意文字(中文、阿拉伯语、印地语随便混), 停止输入后立即显示 LVGL 渲染器真实画出来的效果——这就是字库在设备上的样子。

正式生成

  1. 选生成模式:保持默认的「外挂字库」(Font_Lib.bin + 全套 C 代码)。 每个模式下方有"做什么/什么场景选它"的说明,拿不准就用默认。
  2. 选字体:两种方式任选——上传你自己的 TTF,或直接勾选服务器内置的免费字体 (25 个 SIL OFL 授权字体,可商用可分发,一个文件都不用传)。 例如做中文产品:勾「Noto Sans CJK SC(简体中文全量)」。
  3. 填字符集:字符范围保持 0x20, 0x7e(ASCII),再把界面会显示的中文 直接粘贴进"需要生成的文本"框——只生成用到的字,库最小。 想要全量中文就在范围里再加一行 0x4e00, 0x9fa5
  4. 字号列表16,24(要几个字号写几个),其余参数保持默认 (每个参数右侧都有说明)。点开始生成
  5. 看结果:完成后页面直接显示两张预览图——「字形预览」(字库数据直绘)和 「LVGL 实机渲染」;可改预览文本实时刷新,也可用"查字符"确认某个字在不在库里。 浏览器同时自动下载 result.zip
全程服务器完成,任务串行排队;含全量中文的生成单字号约 1~3 分钟。 生成结果保留 2 小时,请及时下载。

模式选型与功能一览

模式产物什么场景选它
外挂字库Font_Lib.bin + 全套引擎 C 代码 字符多(中文/多语言)、固件放不下字库——绝大多数产品的主力方案,烧外挂 SPI Flash
内部字库inner_*.c(编译进固件) 字符集很小(几十~几百字)、不想接外挂 Flash 的小项目
XBF 字库.xbf + LVGL 官方 lv_*.c / lv_*.bin emWin 工程;纯 LVGL 想要零集成官方格式(LV_FONT_DECLARE / lv_binfont_create);自行二次加工
图标字库icon_font_*.c + 图标宏定义 iconfont.cn 图标当"字"渲染,与文本共用引擎,不用切图

拿不准就选「外挂字库」。另有两个命令行专属功能: emoji 图片字库(--EMOJI,Noto Emoji PNG 转灰度字库,绕开点阵码点只到 BMP 的限制)与 多语言 Excel 转 .c(--LANG,翻译表一键生成 language.c/h,依赖本机 Excel)。

预览与查字符(所见即设备所得)

3生成了什么:产物逐个认识

解开 result.zip,每个文件的职责:

文件它是什么 / 拿来干嘛
Font_Lib.bin字库数据本体,烧写到外挂 SPI Flash(或任何能提供"按偏移读"的存储)
Font_Lib.h字库配置总头文件:LVGL 开关、hash/RLE/缓存等编译期开关都在这
ext_font_engine.c/h字库引擎(自动生成):查表、读 Flash、RLE 解压、缓存、版本校验、缺字兜底
ext_font_app.c/h应用层模板:你只需要在这里实现一个"读 Flash"函数(第 4 章)
cmap_*.c各字库的码点索引表(XIP 常量,放固件里,查字 O(1))
fake_font_*.c兜底字库(编译进固件):字库损坏/缺字时显示占位框,不至于黑屏
ext_font_shaper.c/h变形文字整形器(勾了语言包才有,第 6 章)
lv_*.c / lv_*.binLVGL 官方格式字库(XBF 模式产物,第 8 章):纯 LVGL 用户零集成
preview_*.png生成时的渲染预览图,拿给 UI 设计师确认效果
xbf/*.xbf中间格式点阵文件(兼容 emWin 的 FontCvtST),可独立使用或二次加工

4集成到你的工程(四步)

  1. 烧字库:把 Font_Lib.bin 烧进外挂 Flash(任意起始地址,记住它)。
  2. 加代码:把 zip 里所有 .c/.h 加进工程编译。
  3. 实现读接口:在你自己的代码里写一个 Flash 读函数(生成的 .c/.h 一行都不用改):
    static uint32_t my_flash_read(uint32_t offset, uint8_t *pbuf, uint32_t size)
    {
        /* 从 Font_Lib.bin 烧写起始地址 + offset 处读 size 字节到 pbuf,
           返回实际读到的字节数(成功即 size,失败返回 0) */
        bsp_flash_read(pbuf, size, FONT_LIB_START_ADDR + offset);
        return size;
    }
    引擎与具体 Flash 型号完全解耦——SPI NOR、SD 卡、甚至文件系统都行。
  4. 用起来:启动时把读函数注册给字库引擎:app_font_init(my_flash_read),之后——
    LVGL(v8/v9 自动适配):字库就是标准 lv_font_t:
    lv_obj_set_style_text_font(label, &SourceHanCJK_24_2Bpp, 0);
    lv_label_set_text(label, "你好,世界");
    裸机:引擎暴露"取字形描述 + 取位图"两个回调,按位图逐像素画即可 (Font_Lib.hLVGL_FONT_ENABLE 设 0)。
不想上真机先验证?本站的「实时预览」与「LVGL 实机渲染」用的正是配套的 LVGL PC 模拟器工程(字库 demo + 无头渲染器 lv_render_cli,LVGL 9.3 官方版)——网页上看到的就是设备端引擎画出来的效果, 不必自己搭模拟器。完整参考工程(RT-Thread + LVGL + Nordic,含烧写脚本)见 ZJ_RT_Thread_LVGL_Font_Nordic
与 LVGL 官方字库对比
本方案引擎路径与 LVGL 官方字库的关系

5核心概念与数据格式

这一章解释"为什么",不影响使用;但理解之后,所有参数你都能自己做决定。

5.1 字符集与 Unicode:字是怎么编号的

计算机里每个字符都有一个全球统一的编号——Unicode 码点,写作 U+XXXX。 比如 A 是 U+0041、 是 U+4E2D。常用汉字集中在 U+4E00~U+9FA5(约 2 万个)。文件与网络传输时,码点按 UTF-8 规则变成 1~4 个字节存储; 你在网页上填的"字符范围"就是码点区间,粘贴的文本会被自动转回码点。 点阵字库本质上就是一张「码点 → 位图」的大表。

5.2 XBF:单字号点阵的中间格式

XBF 布局
XBF = 18 字节头 + 密集 cmap + 字形记录,兼容 emWin 的 FontCvtST

每个字号先生成一个 .xbf:头部记录行高/基线/bpp,cmap 按码点直接下标寻址, 每个字形是 12 字节属性(宽/高/偏移/步进)+ 位图。渲染由 FreeType 直连完成——精确像素字号、 原生灰度、自动提取 kerning(字距微调,如 A 和 V 靠近些)。

5.3 Font_Lib.bin:多字库合一的外挂格式

bin 布局
多个字号/字体打进一个 bin,每个字库有独立的稀疏 cmap

打包时按你的字符集配置裁剪(没用到的字不进库),多个字号合成一个 bin。 设备端查字支持两种方式:hash 查表(O(1),推荐)或二分查找;版本 magic 保证 固件里的索引与 Flash 里的 bin 严格配套,不匹配自动兜底,不会显示乱码。

5.4 参数详解:每一项的含义与效果

灰度 bpp(1 / 2 / 4 / 8)

bpp灰度级相对体积适用
12(黑白)单色屏 / 极致省空间;配合 mono hinting 边缘锐利
24彩屏正文的性价比之选,抗锯齿已明显
416大字号标题、对边缘平滑要求高
8256图标/emoji 字库,保留完整灰度

字号列表 / 字高(像素)

外挂字库一次可打包多个字号(如 16,24,32),其余模式填单一字高。 渲染器直接按像素设定字号(FreeType FT_Set_Pixel_Sizes),所得行高、基线为字体真实度量。

字符范围 + 文本(取并集)

范围段每行一对十六进制码点(如中文常用区 0x4e00, 0x9fa5);文本框里直接粘贴界面会出现的文字,两者取并集。 效果:只打包界面用到的几百个字,能把字库从几 MB 降到几十 KB,生成时间同步降一个量级。 码点连续时自动用"连续 cmap"(设备端 O(1) 直算),不连续时自动用"稀疏 cmap"(hash / 二分查表)。

LVGL 接口(True / False)

True:生成的 public_font_t 就是 lv_font_t,可直接赋给 style; 编译期通过 LVGL_VERSION_MAJOR 自动适配 v8 与 v9 官方版 (v9 按 v9.3 契约把字形展开为 A8 写入 draw_buf)。False:走裸机回调 get_glyph_dsc() + get_glyph_bitmap()

hash 查表(True / False)

稀疏字库的 cmap 查找方式。True:开放寻址 hash 表,平均接近 O(1);False:排序数组二分,O(log n)。 两套表都生成在 C 文件里(XIP,不占 RAM),宏一键切换。

RLE 压缩(True / False)

RLE 编码
逐字形字节级 RLE——重复段 [0x80|n][值],字面段 [n][原样字节]

效果:逐字形独立压缩,随机访问不受影响;1 bpp 字库(大片空白)收益最大,bpp 越高收益递减。 代价是解压需要双份字形缓冲(几百字节)。此开关随 bin 写死到 Font_Lib.h,两者必须一致,不可手改。

字形缓存(True / False)

设备端缓存最近 100 条字形描述(可在 Font_Lib.h 改条数)。界面上反复出现的字符命中后 0 次 Flash 读,滚动列表明显更顺。

位流存储(True / False,默认 True)

位图打包对比
行字节对齐(兼容模式) vs 字形内连续位流(默认)

True:打包时去掉每行末尾的补位,字形内按位连续,box_w 上报真实宽度——与 LVGL 官方打包方式一致。 效果:位图体积再省 5%~25%(1 bpp 收益最大)。False:退回行字节对齐布局(裸机代码不想处理位偏移时用)。

基线坐标系(top / bottom)

基线坐标系
top——垂直量从行框顶部向下计;bottom——以基线为原点、LVGL 原生语义
选项存储约定适用
top(默认)FontCvtST 顶部基准,引擎运行时换算给 LVGL要兼容 emWin/FontCvtST 生态、沿用既有工程
bottomLVGL 原生(ofs_y=yMin、基线从底起算),LVGL 路径零换算纯 LVGL 新项目

约定标记写在 XBF 头部,打包器自动生成 BASELINE_TOP_REFERENCED 宏; 同一个 bin 内混用两种约定会在打包时直接报错。

hinting(auto / normal / light / mono / none / autohint)

选项效果
auto(默认)1 bpp 自动用 mono,其余用 normal
normalFreeType 默认 hinting,笔画对齐像素网格,小字号更清晰
light轻 hinting,字形更忠实原设计,边缘更柔和
mono纯黑白渲染(仅 1 bpp),无灰度过渡,单色屏最锐利
none关闭 hinting,完全按矢量轮廓采样
autohint强制 FreeType 自动 hinter,字体自带 hint 质量差时可尝试

变形字体(Variable Font)轴参数

上传含 fvar 表的 VF 字体(如内置思源黑体,wght 250~900)后页面自动出现轴滑条, 服务器用 fontTools instancer 固化成静态实例再进管线。效果:一个 VF 文件产出任意字重的点阵字库。

kerning(自动,无需开关)

渲染时自动从 TTF 的 kern/GPOS 表提取字偶距(如 AV、To 的间距修正), 按目标字号缩放为 1/16 px 精度,随字库生成 XIP 查找表;设备端按"当前字符+下一字符"二分查找修正 advance。 效果:西文排版质量对齐 lv_font_conv;中文方块字无字偶距、零开销;字体没有 kerning 数据时表为空。

5.5 设备端如何工作

设备端取字流程
一次取字的完整路径——缓存 → cmap 查表 → Flash 读取 → RLE 解压 → 渲染,异常统一落兜底字库

6变形文字:阿拉伯语、印地语、泰语……

有一大类语言,两个字符组合后字形会变——简单查表渲染必然出错:

为什么逐码点渲染会错
左:阿拉伯文连写选形;右:天城文辅音合体——都不是"一个码点一张图"能表达的

6.1 背景:哪些语言需要变形,为什么

需要"组合变形"(专业上叫 text shaping / 复杂文本布局)的语言覆盖 40+ 个国家,集中在四大类文字系统:

特殊情况:韩文谚文的音节已被 Unicode 全部预组合成独立码点,按普通字符处理即可; 希伯来文只是从右向左,字母不连写变形,不算变形文字;拉丁、西里尔、希腊、CJK、假名等都不需要变形。

6.2 三组语言包:机制与动态文本支持

语言机制动态文本
A 组希伯来语、泰语、老挝语字形不变形,直接支持(RTL/组合符号零 advance + 位偏移叠画)✅ 完整支持
B 组阿拉伯语/波斯语/乌尔都语/维吾尔语等 Unicode 预变形区(U+FB50–FDFF / FE70–FEFF)+ 设备端小查表选形(ext_font_shaper.c,约 3KB); 字体缺预变形字形时 PC 端用 HarfBuzz 合成入库✅ 完整支持
C 组天城文等印度系 9 文字、僧伽罗、藏、缅甸、高棉、蒙古 合体组合爆炸无取巧办法——把 HarfBuzz 放在 PC 端:按公开语料的高频字位簇整簇预渲染, 映射到 PUA 私用区码点,设备端最长匹配查表(引擎零改动) ✅ 字典命中即正确(96~99%+);未命中生僻簇降级逐码点显示,不乱码

字体 vs 语言包的分工:字体决定"字形从哪来"(原材料),语言包决定"如何整形"(加工工艺)。 只勾字体不勾语言 → 合体/连写散开;只勾语言没有对应字形 → 方框。勾选语言时 Web 会自动勾上对应内置字体。

多个 C 组语言合打一个字库时,簇字典共享 6400 个 PUA 码位(物理上限), 工具会按覆盖率自动削减并打印明细;单语言生成可达 99.9% 覆盖。 完整的方案论证(语言分级/体积估算/风险对策)见变形文字方案技术评审

6.3 在本工具里怎么用

支持它们只需要两个勾选:

  1. 在「变形语言支持」勾选目标语言(如 天城文/阿拉伯字母系)—— 对应的内置字体会自动勾上;
  2. 正常生成。完成后在预览框粘一段该语言文字,亲眼确认连写/合体正确。
语言分级
三组语言的支持机制:A 直通 / B 运行时选形 / C 语料字典预整形

设备端唯一的额外动作:送显前把字符串过一次整形函数(生成包里的 ext_font_shaper.c,约 3KB 查表代码):

char shaped[256];
ext_font_shape_utf8("مرحبا بالعالم", shaped, sizeof(shaped), FONT_SHAPE_FLAG_BIDI_VISUAL);
lv_label_set_text(label, shaped);   /* LVGL 开了 LV_USE_BIDI 时 flags 传 0 */
动态文本(如服务器推送的新闻)也支持:C 组语言内置了从公开语料提炼的 高频字位簇字典(命中率 96~99%+),未命中的生僻组合自动降级为逐码点显示,不乱码。 把产品固定文案粘进"补充文案"框可保证 100% 命中。
簇预渲染管线
原理:PC 端用 HarfBuzz 把"字位簇"整簇渲染并映射到私用区码点,设备端仍是简单查表

7多字体组合(fallback 链)

没有任何一个 TTF 能覆盖所有文字(Noto 全家桶都是按文字系统分成上百个文件的)。 要做多语言产品,把多个字体组成一条链:

主字体建议选覆盖拉丁+你的主要 UI 语言的字体(如 Noto Sans CJK SC); 浏览器多选文件的顺序按文件名排,想指定主字体就给它起个排前面的名字(如 0_main.ttf)。

内置免费字体清单(全部 SIL OFL,可商用/嵌入/分发)

Web 上传框下方可直接勾选这些服务器内置字体;勾选"变形语言"时自动勾上对应文字的字体。 OFL 授权唯一要求:随产品保留字体版权声明,不得单独出售字体文件本身。

字体覆盖文字官方页面
思源黑体 KR(SourceHanSansKR-VF)拉丁/韩文/假名/繁体汉字(变形字体,可调字重) adobe-fonts/source-han-sans
Noto Sans CJK SC简体中文全量(含繁体/日韩汉字) notofonts/noto-cjk
Noto Sans Devanagari / Bengali / Gurmukhi / Gujarati / Oriya / Tamil / Telugu / Kannada / Malayalam / Sinhala 印度系 9 文字 + 僧伽罗文 Google Fonts · Noto
Noto Serif Tibetan / Sans Myanmar / Sans Khmer / Sans Lao / Sans Thai藏文 / 缅甸文 / 高棉文 / 老挝文 / 泰文 Google Fonts · Noto
Noto Naskh Arabic阿拉伯文(含波斯/乌尔都字母) Google Fonts
Noto Sans Hebrew / Mongolian希伯来文 / 传统蒙古文·满文·锡伯文 Google Fonts · Noto
Noto Sans Syriac / NKo / Javanese / Balinese / Cham叙利亚文 / NKo / 爪哇文 / 巴厘文 / 占文 notofonts.github.io

授权提醒:操作系统自带字体(macOS 冬青黑/GeezaPro/各 MN 系列、 Windows 微软雅黑等)多为商业授权,转成点阵字库分发给第三方通常超出授权范围——分发场景请使用本清单的 OFL 字体。

8进阶能力

8.1 LVGL 官方格式(零集成)

只想要标准 LVGL 字库、不想集成引擎?用「XBF 字库」模式,产物自动附带: lv_*.c(LV_FONT_DECLARE 即用)与 lv_*.bin (lv_binfont_create() 运行时从文件系统动态加载,可 OTA 换字库)。 官方格式同样携带变形文字簇——纯 LVGL 也能正确显示印地语。 注意位图超 1MB 的大字库需在 lv_conf.hLV_FONT_FMT_TXT_LARGE

8.2 BDF 导出:预览与逐字修饰

参数区勾「BDF 导出」,可用 BdfEditor/FontForge 打开预览、逐像素修饰个别字符 (小字号笔画粘连的手工优化),再用命令行回填:

python xbf_to_bdf.py --xbf xxx.xbf --patch edited.bdf --out-xbf new.xbf   # 1bpp 无损

8.3 命令行与批量化

Web 的每个能力都有对应的命令行版本(CI/批量生成场景)。源码暂未公开, 如需命令行/批量集成请通过页尾的公众号或 QQ 群联系作者;参数形式如下,供了解能力边界:

# 环境(Python ≥ 3.9)
python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt

# 多字体链 + 变形语言, 生成 XBF(自动附带 LVGL 官方格式)
python Py_FontMaker.py --XBF True --min 0x20 --max 0xfeff \
  --ttf main.ttf,NotoSansDevanagari.ttf,NotoNaskhArabic.ttf \
  --langs devanagari,arabic --bpp 2 --height 24

# 打包外挂字库(先按字号生成 XBF, 再打包)
python Py_FontMaker.py --LIB True --lib_file ./font_type/my_lib.txt --ttf main.ttf --bpp 2 --height 24

全部参数详解见第 5.4 节;需要"全语言通用字库"(25 字体链、覆盖全部内置语言) 可直接联系作者获取成品 bin,不必自己生成。

8.4 与 LVGL 官方字库怎么选

LVGL 官方 lv_font_convPy_FontMaker 外挂字库
字库位置内部 Flash(C 数组)或 RAM(binfont)外挂 SPI Flash,流式按需读取
CJK 全量3 MB+ 内部 Flash,多数 MCU 放不下可行(外挂 Flash 容量大成本低)
渲染 IO(直接取址)每字形 1~2 次 SPI 读(有缓存兜热点)
字库独立升级随固件重烧独立 OTA + 版本闭环
kerning / 位流支持支持(本工具已对齐)
emoji / 图标 / 多语言需自行组合其他方案一条龙
一句话选型:拉丁小字符集、内部 Flash 充足 → LVGL 官方 C 数组; CJK 大字符集、内部 Flash 紧张、字库要独立升级 → 本方案。两者可在同一工程混用(都是 lv_font_t)。 逐维度深入对比见点阵字库方案详解

9排错手册与常见问题

现象原因与解法
某些字显示空心方框 该字不在字库里:①字符范围/文本没包含它——补上重新生成; ②所选字体本身没有这个字形(如韩版思源缺大量简体字)——fallback 链里加一个覆盖它的字体。 用结果区的「查字符」可立即定位属于哪种。
印地语/高棉语个别组合散开显示 生僻字位簇不在语料字典(降级显示,不乱码)。把含它的文案粘进"补充文案"框重新生成即 100% 命中。
阿拉伯语显示成孤立字母或方向反了 送显前没过整形:调 ext_font_shape_utf8();多行文本建议 LVGL 开 LV_USE_BIDI(此时 flags 传 0,别做二次 bidi)。
设备上全是兜底方框,PC 预览正常 固件与 bin 版本不配套(引擎有 magic 校验)——两者都用同一次生成的产物重新烧写。
换了 RLE/位流开关后乱码 这两个开关随 bin 写死,不能只改 Font_Lib.h——重新生成一套即可。
生成的字库太大 ①只放用到的文本,别全量 0x4e00-0x9fa5;②开 RLE + 位流;③降 bpp(4→2); ④多语言时按目标市场拆分生成。
全量 CJK 生成很慢? 0x4e00~0x9fa5 逐字栅格化需要一些时间属正常;只打包界面用到的文本能把时间和体积都降一个量级。
生成的 .c 里字体名不是合法 C 标识符? TTF 文件名只用字母/数字/下划线;Web 端会自动清洗。
emoji 怎么显示?码点超过 0xFFFF? 点阵字库码点上限为 BMP(u16);增补平面的 emoji 用图片字库方案(命令行 --EMOJI)。
裸机下开了位流存储,位图怎么解析? 字形内按位连续:第 y 行起始 bit = y×box_w×bpp,逐行取 box_w×bpp 位。不想处理位偏移就把「位流存储」设为 False。
top 和 bottom 基线能混用吗? 同一个 bin 内不能(打包会报错);不同工程/不同 bin 各选各的没问题。
LVGL v9 需要额外适配吗? 不需要。生成代码按 LVGL_VERSION_MAJOR 自动切换 v8/v9 回调契约(按 v9.3 官方发布版验证)。
多选字体时怎么确定谁是主字体? 上传框下方会列出链顺序,第一个即主字体;浏览器多选一般按文件名排序,必要时给主字体加个排前面的文件名前缀。
结果 zip 能保留多久? 服务器保留 2 小时,请及时下载;任务串行排队执行。

10深入阅读

本文由 2022 年的《嵌入式字库研究及 Py_FontMaker 工具编写》重写而来,内容与当前代码保持一致。 交流:公众号 Bluetooth-BLE · QQ 群 177341833 · 返回生成页