1
点阵汉字
点阵字体(Dot Matrix Fonts,又称Bitmap Fonts)的使用,早已成为世界上第一台广为人知的电子自动排版机器。这是1966年德国发明家Ing博士。这是Rudolf Hell发明的外壳50。
Hell 50T1 Digiset [2]
而中文点阵字体的使用也有几十年了,那时候比较流行软/硬汉字系统(看你是否知道 CCDOS,UCDOS,213 什么的?),常用到 16 和 24 点阵的汉字。由于以前屏幕的分辨率比较低,点阵汉字还是相当的够用。后来,随着图形化操作系统的普及,矢量字体(Outline Fonts, Vector Fonts)大行其道,其矢量渲染的方式能够显示出平滑的字体,体验大大超过了传统的点阵字体,理所当然的成为了当前的主流。
那么是不是点阵汉字就已经退出历史舞台了呢?并没有。现在街上能常常见到的简易 LED 屏,很多都还是用的点阵汉字。很多工控或者简易屏幕上,也都还在使用点阵汉字,这是因为同矢量字体相比,点阵汉字占用的空间极小,这是由于点阵汉字的特性所决定的,一般一个点阵汉字是这样的:
如上图所示,没有像素的点的值设为 0,有像素的点的值设为 1,那么一个 16 点阵汉字就可以用 16x16 位,也就是 4 个字节(Byte)来表示,所以非常节省空间,因此它非常适合用在早期的电脑系统以及需要低成本使用的情况下。尽管它放大之后既不平滑也不利于阅读,但是在文字尺寸比较小的情况下,却有着超过矢量字体的清晰度。所以,在今天的某些汉字字体中,也还包含有多组点阵字库,在特定文字尺寸的时候(比如:12px - 16px),就会使用这些点阵字体来代替矢量字体。
点阵汉字应用场景还是非常广泛,那么上面还没有提到的一点就是:使用在像素游戏中。
2
在游戏中使用点阵汉字
要想在游戏中使用点阵汉字,有两种方法:
一种是使用早期的 GB2312-80 的汉字库,然后编写程序自行解析或者绘制,这里有一篇文章()可以帮助您了解解析的方法。
使用这种方法相对繁琐,而且要想换成其它语言也要写相应的代码,但是好处也是显而易见的:那就是可以控制点阵汉字的每一个点(Pixel),可以轻易显示出多彩的汉字,甚至可以针对每一个点制作动态的效果,想象力够的话,可以将汉字表现得很炫。(如果今后有机会我会写一篇相关的教学,不做保证 :D)
还有一种方法就是使用带有点阵字库的字体,这样可以轻松的支持多种语言,而且在需要平滑字体的时候也可以使用。不过呢,只有特定尺寸的汉字可以显示成点阵汉字。不过这种方法是做不到对汉字的到点(Pixel)的操作。
目前大家使用比较多的是直接使用带有点阵字库的 True Type 字体,不过由于限定在固定尺寸的汉字才能显示出点阵字体,所以当想要任意尺寸表现的点阵汉字的时候,就受到很多限制。虽然可以使用各种方法来达到目的,但是如果有一种字体它既是矢量的又表现得跟点阵字库一样的话,可能用起来就自由多了。所以,这就有了另外一种方法:将点阵字体矢量化成一个新的矢量字体,无论怎样使用都是表现出某一点阵字体的特性。比如,著名的 04 Bitmap 字体,就是这样的:
Yuji Oshimoto 的 04 像素字体
()
这种方法虽然见仁见智,有利也有弊,但是,也不失为一个解决方案。尤其是在本地化海外游戏的时候,如果原游戏使用了像素字体,而在中文化之后如果直接使用矢量化的点阵字体,就会是一个非常棒的选择。
所以,我们今天就来试着自己做一套像素汉字字体。
3
准备工作
开始教程之前,需要先准备好如下几项:
FontForge()
FontForge(2004 年 3 月前称为 PfaEdit)是一款全功能的支持所有通用字体格式的字体编辑器,主要由 George Williams 开发,FontForge 是自由软件,并以 GNU 通用公共许可证第 3 版及三句式 BSD 许可证授权。该软件用于多个操作系统(包括 Linux、Windows 和 OS X)并翻译成 12 种语言。[3] 具体的安装方法请看这里(),我们不做赘述。
ImageMagick(http://www.imagemagick.org/script/index.php)
ImageMagick 是一个用于查看、编辑位图文件以及进行图像格式转换的开放源代码软件套装。它可以读取、编辑超过 100 种图象格式。ImageMagick 以 ImageMagick 许可证(一个类似 BSD 的许可证)发布。[4] 各个系统下的下载安装方法请见这里(http://www.imagemagick.org/script/binary-releases.php)。
一个包含有点阵字库的字体,或者通用格式的点阵字库
可选择的带有点阵汉字库的字体还是不少的,大家在 Windows 下常用的 SimSun 就包含有多种尺寸的点阵字体。为了便于涵盖各个不同平台的读者,我们这里选择的例子是著名的开源字体文泉驿的正黑体。
该字体包含了所有常用简体中文、繁体中文,日文及韩文所需要的汉字(最新版本包含超过 27842 个汉字,完整覆盖 GB2312/Big5/GBK/GB18030 标准字符集)。该字体同时还包含了英文、日文、韩文和其他多种语言符号。该点阵字体包含五个屏幕常用字号(9pt-12pt),逾 21 万汉字点阵。Windows 版需要下载文泉驿正黑体,正黑体嵌入了所有 GBK 汉字点阵,在9-12pt范围内,将自动使用点阵宋体显示。[5]
Python 环境支持
我们要求的这几项都是可以跨 Windows,Mac OSX,Linux 平台的,而且均为开源项目,便于大家亲自尝试。
我们的教程是基于 Mac OSX 撰写的,其它平台也基本上一致。
4
制作文字
一、提取点阵汉字
首先,我们要做的是提取点阵汉字。虽然文泉驿已经提供了 9pt - 12pt 的 pcf 格式的字体,可以直接使用,但是为了让大家能够随意处理自己选用的字体,所以还是先讲讲怎么提取点阵汉字。
我们打开 FontForge,选择导入文泉驿正黑 wqy-zen,这其中包含有三个项目,我们选择带有点阵字库的WenQuanYi Zen Hei Sharp 导入。接下来就会询问是否要导入某一尺寸的点阵字库,在本教学中,我们选择 16 点阵的。
按照这个步骤读取想要的点阵字库
完成选择后,字体就会正常导入到 FontForge 里面了。
打开的字库
目前在 FontForge 中打开的字体包含了点阵和矢量两部分,其实我们只需要点阵部分,所以要再做一次输出,将其中的点阵字体库输出成 BDF 点阵字库。
选择 File | Generate Fonts… 然后按照如下的设置选择“No Outline Font”以及“BDF”格式,点击 Generate 就可以生成提取的点阵字库了。
输出点阵字库
这个字库会留着备用,但是如果您愿意的话可以用 FontForge 打开看一下,可以看到已经只是点阵字体了。
得到的 16 点阵字库
二、配置 Auto Trace
由于 FontForge 的自动矢量化插件并不是自带的,所以我们要安装第三方的插件,我们推荐的是 Potrace(应该是效果最好的),在前面也提到过,安装了 Potrace 之后要注意,需要设置 AUTOTRACE 的环境变量,以便 FontForge 能够找到它。
Windows 下直接安装即可,Mac 和 Linux 下如果没有使用 port 等方式安装的话,也就需要简单手动处理下。下面就说一下我在 Mac 上的安装过程。
1、下载并打开 Potrace 的包以后,将 potrace 和 mkbitmap 移到可以直接访问的地方,个人建议是 /usr/local/bin
2、然后将 potrace 设置为 AUTOTRACE 的目标
export AUTOTRACE=/usr/local/bin/potrace3、另外,如果安装了多个矢量化插件的话,为了确保使用 Potrace,我们还需要在 FontForge 中设置一下。选择 File | Preferences 打开设置面板,选择 Apps,将Prefer Potrace 设置为“On”
4、另外根据我在 Mac 下的经验,由于是通过 X11 启动的 FontForge,所以应该先关闭 FontForge,通过 X11 的终端命令行执行 export,然后再通过终端打开 FontForge,比如我这里是:
/Application如果配置正确,那么 Autotrace 将在后面可以使用了,请看下一步。
三、准备我们的新字库
完成上面的准备工作以后,我们可以再次打开 FontForge 了(配置好 potrace 后,Mac / Linux 通过命令行打开),然后按照以下步骤:
File | New,创建一个新字体;
选择菜单:Encoding | Reencode | ISO 10646 (Unicode BMP),此举是因为在默认设置情况下,新字体的编码是ISO 8859-1 (Latin1);
现在导入我们之前提取的 BDF 格式点阵字库:File | Import。打开导入窗口之后不要着急导入,要记得如图所示,将点阵字库作为背景(Background)导入;
导入后,就会发现,有字体内容的部分变了颜色,代表已经成功导入到背景。双击某一个字,就可以打开该字的详情窗口,我们可以在这里对字体进行所有复杂的操作。接下来,我们就要通过导入的背景点阵图来自动矢量化字体了。
四、正确的矢量化点阵如果配置正确,那么,在字体的 Element 菜单下的 Autotrace 功能应该是可用了,我们在文字的窗口点击Element | Autotrace,就会自动跟踪出新的文字轮廓。不过,现在可能是这个样子:
矢量化效果不尽如人意这根本不符合我们的要求,我们要的是点阵像素的风格,而自动矢量化将其变成了平滑的曲线。这个问题看起来比较棘手,但是通过 Google,发现有人(Ben Morris)解决了这个问题:他将 potrace 更名为 potrace-bin,然后写了一个名为 的脚本来作为矢量化入口。在这个 的脚本中,将位图放大十倍,然后再跟踪,最后再恢复回去,就可以得到漂亮的点阵文字了。[6]方法如下:1.将 potrace 更名为 potrace-bin;
2.创建 。 代码如下:
# get the last parameter passed by fontforge - the name of the temp img filefor last; do true; done
# get all of the other parameters
length=$(($#-1))
array=${@:1:$length}
array="`echo "$array" | sed -E 's/ -r ([0-9]+)/ -r 10/g'`"
# get the size of the passed image
size=$(identify $last | grep -Eo "[0-9]+x[0-9]+" | head -1)
# multiply that size by 10
newsize=$(python -c "x = '$size'; print('x'.join([str(int(i)*10) for i in x.split('x')]))")
# scale up 10x and then use potrace to trace the pixelated outline
cat $last | mkbitmap -s 1 | convert -scale $newsize - - | potrace-bin -a 0 $array
(此段代码有修正,原文地址在这里:)
注意:这段代码针对 Mac 有修正,如果是其它系统下使用,需要将 grep -Eo 改为 grep -Po,sed -E 改为sed -r。
之后记得将 设为拥有可执行权限。
chmod 0755现在,再做一次 Element | Autotrace看看效果:
完美!
五、矢量化并输出
接下来关闭文字窗口,在字体列表上用 Ctrl+A 选择所有字体,然后选择 Element | Autotrace,耐心的等待一会儿,全部字体就矢量化完成了。查看字体是否完成很容易,只要看看原来的空位上是否显示出了文字轮廓就可以了。
矢量化全部字体中
生成的字体可能在某些地方有问题,比如缺少笔划或者约束(Constrain)等等,根据需要自行调整一下即可。一般这些不完整的内容会出现在英文部分以及最后的位置 65281 开始的汉字标点符号处 [7],而其它的汉字基本上均无问题。总之,后续还是需要少量的处理的,具体的看您的需要。
有错过或者缺少的字
处理好这些有问题的字体以后,基本上就可以了,如果自己想要添加特别的符号或者汉字,也有大量的空位去做这些。
都处理完毕之后,就可以在 Element | Font Info…中定义字体的各个属性,比如 Font Family,Font Name 之类的。然后就可以输出(File | Generate Fonts...)了。
如上图所示,选择“Ture Type”和“No Bitmap Fonts”,再Generate 就会生成新的点阵汉字转换的 Ture Type 字体了。这个字体可以直接在 Unity 或者其它软件中使用,甚至直接用做系统字体,永远表现为点阵字体。
5
结束语
本人并不是字体方面的专家,也没有更多的研究过字体相关的内容,所了解的都只是皮毛。本文的主要目的是提供大家提取和制作矢量点阵汉字的方法,所以文章之中有不恰当的地方欢迎大家批评和指正。
另外我们在教学中所使用的文泉驿字体需要遵循 GPL 协议,所以对该字体进行的修改以及衍生也要遵循 GPL 协议。另外有一款字体 FireFly(萤火飞)则是支持双协议:GPL / APL [8]。请大家在使用的时候注意。另外在使用其它字体的时候也同样要注意授权协议,以免侵害原版权方的合法权益。
6
参考
[1] The Birth of Digital Type
[2] Christoph Knoth, COMPUTED TYPE DESIGN, p.16。
[3] ,来自 WikiPedia
[4] ,来自 WikiPedia
[5]
[6] Ben Morris,MonsterFace Games: Creating a pixel font for your game。
[7] ,汉字标点符号。
[8] “文泉驿”用户常见问题解答。
详细的资料地址,请点击下方“阅读原文”。
1.《打印机矢量字体库怎么用?总结很全面速看!如何将点阵汉字矢量化 | indienova》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《打印机矢量字体库怎么用?总结很全面速看!如何将点阵汉字矢量化 | indienova》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/2980085.html