Home
Welcome to the DotFont wiki!
单个字符的点阵字形说白了就是一个只有黑白两色的位图(Bitmap)。点阵字形适合于小字号显示,因为其清晰锐利,但无法缩放。当然也有人更喜欢矢量字形,特别是MacType渲染的矢量字形比渣渣Windows ClearType好得多。即使是基于Linux的Android染渲的矢量字形效果也比ClearType要好。
矢量字形渲染到以像素为单位的屏幕上,不可避免要经过栅格化这一步,这个状态的字形数据可以认为是点阵数据了,只不过可能含有灰度甚至色彩。
说到存储不可避免地提到字符集与编码。给所有需要用到的字符确定一个独一无二的编号(比如从0开始),这样就可以在计算机中以数值编号来代替这个字符,无需存储该字符的图形/图像数据。需要显示时才从字体文件中查找出编号对应的图形/图像,显示到屏幕上。
例如ASCII字符集一共收录了128个字符,其中有一些是不可打印的控制字符,另一些则是可以打印的字符。那么ASCII字符集的字体该怎么组织呢?只需按照每个字符的编号顺序,依次存入单个字符的图像数据即可。有时候为了简单起见,那些不可打印的控制字符也会一并用空的填充用数据存入字体。
各个字符的图像数据依次按照区、位顺序存入。
如果某字符的区号为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.
曾经见过某些游戏资源里用的英文点阵字体直接用无损压缩的图片(如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