撰写了文章 发布于 2019-08-07 23:07:51
ipix中文像素字体的制作
前言
一直以来困扰着我的一个问题就是中文像素字体,像素游戏中可使用中文像素字体其实是比较少:文泉驿、最像素和方正像素。文泉驿的像素字体格式比较奇怪,不像TTF可以直接在Unity和其他游戏引擎中使用。而最像素和方正像素,1000美元的单个项目的授权费用对于我这种个人开发者和业余开发者来说,是很昂贵。
所以自己动手丰衣足食,尝试制作一个符合自己需求的轻量级的像素字体。
制作思路
其实就是将字模转换成矢量字体。如果自己在游戏引擎中解析和绘制字模感觉比较麻烦工程量不小。所以将其转换成矢量字体会更加容易使用。
经bitca的推荐,了解到了HZK16这个16×16的字模。这个字模的版权其实算是比较模糊,年代也比较久远(可能要追溯到DOS时代)而且很多嵌入式硬件厂商都直接拿来商业使用,所以拿来游戏中使用应该问题不大。
制作的基本思路就是提取字模全部文字,解析字模并且绘制成PNG图片,再使用Potrace把像素PNG图片转成矢量SVG图(通过ImageMagick),最后再把SVG图片导入FontForge中就制作完成了。
制作过程
主要使用的是Python, 解析字模参考这篇文章。而绘制PNG图片也很简单,解析完成之后会得到汉字的数组,通过Python的pillow库进行绘制成PNG。而后通过脚本(png2svg.sh)将其转成SVG:
#!/bin/bash
File_png="${1?:Usage: $0 file.png}"
if [[ ! -s "$File_png" ]]; then
echo >&2 "The first argument ($File_png)"
echo >&2 "must be a file having a size greater than zero"
( set -x ; ls -s "$File_png" )
exit 1
fi
File="${File_png%.*}"
magick "$File_png" "$File.pnm" # PNG to PNM
potrace "$File.pnm" -s -o "$File.svg" # PNM to SVG
rm "$File.pnm" # Remove PNM
而后运行png2svg.sh pngfile 就会得到SVG图片。
可以把汉字与其对应的图片写入到一个文件中,后面就可以读取文件得到一一对应汉字和文件名字,然后这些可以使用脚本批量生成,也就会得到6000多个SVG文件。
再接下来就是使用命令导入到FontForge中,FontForge的脚本资料很少,这个是我的脚本文件,命名为convert.pe
#! /Applications/FontForge.app/Contents/MacOS/FontForge
fontName = "9"
svg_file = "186_item.svg"
Open($1)
list = Ucs4(fontName)
num = list[0]
Select(num)
Cut()
Import(svg_file)
Save()
这个脚本作用就是找到对应的汉字,然后导入SVG图片再保存。本来是想通过命令行传入两个参数:汉字和SVG文件名字。但是一开始是在Windows上,可能编码问题命令行传入的汉字和实际不一样。折中方案就是通过脚本直接修改这个脚本文件中的两个值,然后再执行脚本。不过最后还是使用Mac来执行脚本,Windows编码问题总是感觉问题多多。
而在Mac上最好是通过这样方式来执行脚本:
FontForge -script convert.pe test.sfd
最后就是读取配置写一个循环来导入每个汉字就可以了。但这里也是会遇到一个坑,可能是执行脚本速度太快,一个脚本还没关闭另外一个脚本就打开工程,这样同时打开同一个工程可能会导致数据丢失,后来把每次执行脚本时间调大之后就不会常常丢失数据。我是100,200个汉字间隔这样手动执行然后对比以前版本看看有没丢失(感谢git),不然全部都一次执行要等待时间太久。这些全部导入等待时间基本花了我三天左右……
这个字体的优缺点
字体只有6000多个汉字,覆盖一般使用场景基本没有问题。缺点也明显,字数不够多没有覆盖日语韩语字,而且宋体感觉不如最像素字体好看。
下载地址
这个字体叫做ipix( indie pixel font ),适合于跟我一样资金有限但又期望在商业游戏中使用像素字体的小开发者。
itch: https://purestudio.itch.io/ipix
亚恒 1年前
Sadi [作者] 1年前
发布
林荫 1年前
Sadi [作者] 1年前
发布