把自己的字,变成电脑里的字体:我做了一个「手写字体工坊」
如果电脑里能选到一种字体,名字就叫"我的手写字",会是什么感觉?
给朋友写一张电子贺卡,给照片加一行标题,或者把孩子现在写的字保存下来------屏幕上的每一笔,都能找到纸上对应的那一笔。
最近,我用 C# 做了一个 Windows 桌面小工具:我的手写字体工坊。
它的流程很直观:
选好要制作的字 → 打印模板 → 手写拍照 → 采集与校对 → 导出 TTF 字体。
软件在本地运行,不需要显卡、模型权重,也不需要把照片上传到服务器。
先看一张真实纸张生成的字体预览:

真实手写照片生成的 TTF 预览,阈值125,尚未手工精修
上图由实际生成的 TTF 字体绘制。它还是试用稿,部分细笔画和残留格线需要继续校对。
先用一张纸,试出自己的字体
这次测试用的,就是下面这张手写页。
纸上写了"你好世界""我的手写字体",也写了数字和几个标点。没有精心布光,纸面还有一点明暗变化,更接近日常使用时会遇到的情况。

本次实测的手写模板照片
这张纸一共填写了 41 个字格。测试时,软件找到了四个黑色定位块,也匹配到了页面校验码,完成了这 41 格的采集,并生成了能够加载、显示的 TTF 字体。
不过,真实照片也让问题显现出来了:有些印刷格线,会和手写笔迹一起被采进去。
把墨迹阈值从默认的 170 调到 125 后,格线残留明显减少。但"你"的细笔画有所损失,"2、8、?"附近仍有残线。

默认阈值170与阈值125的实际采集对比
所以,目前更适合把它看作一个"采集后可以继续修"的制字工具。拍照完成后,仍然要看一遍字形,再决定是否导出成品。
软件怎么用?
第一步:输入想做成字体的字
打开软件,在"字符与模板"页面输入字符列表,点击应用。
可以先选一小组有意义的内容:自己的名字、家人的名字、一句祝福语,或者经常用到的标题文字。重复的字会自动去重,不用写两遍。
当前单个工程支持 1~1000 个不同的常用中文、英文、数字和标点字符,第一次建议先试 30~100 字。
写了多少字、确认了多少字,字体里就有多少字。 当前版本不会根据几个样本自动补齐整套中文字库。
第二步:导出模板,拿笔填写
软件按 A4 页面生成书写模板,每页最多 48 格,支持导出 PDF 和 PNG。
PDF 里的格线和提示文字是矢量轮廓,放大查看不会变成整页截图;提示文字没有可复制的文本层。
建议先保存工程,再导出模板。打印时选择实际大小,用黑色笔把字写在对应的浅灰框内,并保留四角定位块和页码校验区。
当前也提供系统打印入口,实体打印机的兼容性还在继续排查。现阶段可以优先导出 PDF 或 PNG,再使用熟悉的阅读器、图片软件打印。
第三步:拍照,采集这一页
写完后,把整页纸拍进去,尽量拍清楚、放平,避免明显阴影。
在"照片采集"页面选择图片,并选择对应页码。软件会尝试自动找定位块;找不到时,也可以按左上、右上、右下、左下的顺序手动点选。
随后点击"采集当前页",各个字形就会进入校对列表。
照片不一定要拍得完全水平,软件会做四点透视校正。但弯曲的纸张、严重模糊和大片阴影,仍然可能影响结果。
还有一个小提醒:更改字符列表后,要重新导出模板。 软件通过页面校验,减少把其他工程或其他页的字形采错位置的情况。
第四步:校对,保留自己的笔迹
"逐字校对"页面提供了画笔、橡皮、撤销和清空操作,也能调整字形大小、水平位置、垂直位置与粗细。
比如拍进来一小段格线,可以用橡皮清掉;漏了一小段细笔画,可以补回来。对字形满意后,再点击确认。

逐字校对界面:画笔、橡皮、撤销及字形调整
这张界面图使用合成测试笔画演示操作;本文前面的实拍照片、字体预览和阈值对比,才是本次真实手写测试的结果。
中文里,一个字往往包含几个分开的部分,例如"湖""谢"。软件按整格采集这些部分,保留它们在格中的相对位置。"一"这样的简单字,也不会因为笔画少就被拉伸成满格。
第五步:预览句子,导出 TTF
在"字体预览"页面输入一句话,就能查看自己的字排在一起是什么效果。
预览使用真正生成的 TTF。遇到没有制作的字,软件会显示红框,方便发现缺字。
导出时会生成两个文件:
- TTF 字体文件:可以在支持自定义字体的软件中使用。
- 字符覆盖清单:记录这次实际导出了哪些字,还有哪些字没有导出。
需要在其他软件中使用时,可以通过 Windows 安装导出的字体,再选择对应的字体名称。部分软件需要重新打开,才能刷新字体列表。
它是怎样把照片变成字体的?
这套流程主要依靠图像处理和字体文件生成。
首先,通过四个定位块估计纸张的位置,把拍斜的页面映射回模板坐标。每个书写框的位置已知,因此可以按格提取图片。
字形对应哪个字,由模板事先确定。 比如"湖"所在的格子,采集出来就对应"湖";这里不依赖手写文字识别来猜字。
然后,软件结合灰度和局部亮度差,把墨迹与纸张背景分开。这个步骤也解释了为什么阈值需要调整:阈值放得宽,容易混入格线;收得紧,又可能丢掉浅笔画。
接下来,软件追踪墨迹的外轮廓和内部孔洞,将轮廓转换成矢量字形,保存字符映射、字形位置等信息,最后组装为 TTF 文件。
生成后的字形可以按字号缩放。当前轮廓还没有专业字体那样的小字号精修,比较适合先用于姓名、贺卡和个性标题。
对 C# 开发者,也是一份可以拆开学习的项目
项目采用 C# WinForms、.NET Framework 4.8、x64,提供完整的 VS2022 解决方案。
窗体保留 .Designer.cs,方便在设计器中调整布局。图像预览和字形编辑使用标准控件配合绘制事件;模板布局由预览、PDF 和打印功能共用。
工作目录默认是 EXE 旁的 workspace,按程序所在目录解析相对路径,便于把软件与数据一起移动。工程文件自带字形和调整参数,保存工程后,后面还可以继续补字。
这个选题参考了 draw-your-font(github.com/danilo-znam... 的使用流程。本项目重新实现了中文固定格采集、校对界面和基本 TTF 生成,没有捆绑上游的 Node 或 Potrace 运行环境。
如果你对桌面图像处理、矢量轮廓、字体文件结构、PDF 排版感兴趣,可以沿着这条流程逐步看下去。
可以拿它做些什么?
我比较喜欢的几个用途是:给朋友做一张带自己笔迹的贺卡,给家庭相册写标题,或者隔一段时间采集一次孩子的字,留下成长的变化。
不用一开始就想着做几千个汉字。先把一句想留下的话做出来,就已经能看到这件事的乐趣。
当前版本支持 Windows 10/11 x64,需要 .NET Framework 4.8。常用汉字、数字和标点可以按需制作;emoji、扩展区汉字以及自动补全字库暂不支持。
接下来会继续打磨格线抑制、浅笔画保留和真实照片的采集效果。这次实拍已经帮我们找到了很具体的改进方向。
想交流软件使用、源码学习和后续改进,欢迎加入:
QQ群:天天代码码天天
群号:264292622
也欢迎分享你想用自己的字体写下的第一句话。