Skip to content
杨敏 edited this page May 25, 2014 · 1 revision

Welcome to the DotFont wiki!

点阵字体基本概念

单个字符的点阵字形说白了就是一个只有黑白两色的位图(Bitmap)。点阵字形适合于小字号显示,因为其清晰锐利,但无法缩放。当然也有人更喜欢矢量字形,特别是MacType渲染的矢量字形比渣渣Windows ClearType好得多。即使是基于Linux的Android染渲的矢量字形效果也比ClearType要好。

矢量字形渲染到以像素为单位的屏幕上,不可避免要经过栅格化这一步,这个状态的字形数据可以认为是点阵数据了,只不过可能含有灰度甚至色彩。

点阵字体的存储

说到存储不可避免地提到字符集与编码。给所有需要用到的字符确定一个独一无二的编号(比如从0开始),这样就可以在计算机中以数值编号来代替这个字符,无需存储该字符的图形/图像数据。需要显示时才从字体文件中查找出编号对应的图形/图像,显示到屏幕上。

例如ASCII字符集一共收录了128个字符,其中有一些是不可打印的控制字符,另一些则是可以打印的字符。那么ASCII字符集的字体该怎么组织呢?只需按照每个字符的编号顺序,依次存入单个字符的图像数据即可。有时候为了简单起见,那些不可打印的控制字符也会一并用空的填充用数据存入字体。

GB2312编码的字体存储

各个字符的图像数据依次按照区、位顺序存入。

如果某字符的区号为a(1 <= a <= 87),位号为b(1 <= b <= 94),那么其在字体文件中的偏移顺序即为 94 * (a-1) + b - 1

设某字符GB码为 (highByte, lowByte)

那么其区位码为 ((highByte - 0xa0), (lowByte - 0xa0))

那么其字形数据起始地址在字体文件中的偏移量为 ((highByte - 0xa0 - 1) * 94 + (lowByte - 0xa0 - 1)) * bytesPerChar,其中bytesPerChar为每个字符占用字节数。

化简得偏移量为 bytesPerChar * ((highByte - 0xa1) * 94 + lowByte - 0xa1)

bytesPerChar * ( 94 * highByte + lowByte - 0x3bbf)

而每个字符的图形数据,则是按照从左向右、从上到下顺序,逐行像素按位存储。如果宽度不能被8整除,那么该行余下的低位置0.

ASCII字符集的字体

曾经见过某些游戏资源里用的英文点阵字体直接用无损压缩的图片(如png)来存储。这种字体文件中针对可见字符,按照ASCII编码值依次排列成长长的一行或一列,构成一幅图片。这样子修改起来倒也方便,用绘画软件就可以。

读取点阵字体中字符图像数据例子

字模来源: 12X12中文点阵字库下载

“啊”字的区位码:16 01

bytesPerChar = ceil(12/8)*12 = 24

图像数据在字体文中的顺序偏移量:

15*94 + 0 = 1410

1410 * bytesPerChar = 33840

用WinHex得到的字节数据

image data:

    字节    Bit位
    1D E0   0001 1101 1110 0000
    F4 20   1110 0100 0010 0000
    B4 20   1011 0100 0010 0000
    BB A0   1011 1011 1010 0000
    B6 A0   1011 0110 1010 0000
    B6 A0   1011 0110 1010 0000
    F7 A0   1111 0111 1010 0000
    1C 20   0001 1100 0010 0000
    10 20   0001 0000 0010 0000
    10 20   0001 0000 0010 0000
    10 E0   0001 0000 1110 0000
    00 00   0000 0000 0000 0000