学习各种大小点阵字体显示,参考网上资料,简单记录一下!
-----第一部分-----点阵字体数据的存放格式----
最常见的是 16*16 的点阵,意思是说每1行有16个点,一共有16行。由于1个点使用1个比特位来表示,如果这个比特位的值为1,则表示这个位置有点,如果这个比特位的值为0,则表示这个位置没有点。从而1行就需要16个比特位,而8个比特就是1个字节,也就是说,这个点阵字体中,一行的数据需要两个字节来存放。第1行的前8个点的数据存放在点阵数据的第1个字节里面,第1行的后面8个点的数据存放在点阵数据的第2个字节里面,第2行的前8个点的数据存放在点阵数据的第3个字节里面,然后后面的就以此类推了。这样我们可以计算 16*16 的点阵出存放一个点阵总共需要32个字节。
再比如 16*8 的点阵,意思是说每1行有16个点,一共有8行。由于1个点使用一个比特位来表示,如果这个比特位的值为1,则表示这个位置有点,如果这个比特位的值为0,则表示这个位置没有点。从而1行就需要16个比特位,而8个比特就是1个字节,也就是说,这个点阵字体中,一行的数据需要2个字节来存放。第1行的前8个点的数据存放在点阵数据的第1个字节里面,第1行的后面8个点的数据存放在点阵数据的第2个字节里面,第2行的前8个点的数据存放在点阵数据的第3个字节里面,然后后面的就以此类推了。这样我们可以计算 16*8的点阵出存放一个点阵总共需要16个字节。
再比如 8*8 的点阵,意思是说每1行有8个点,一共有8行。由于1个点使用1个比特位来表示,如果这个比特位的值为1,则表示这个位置有点,如果这个比特位的值为0,则表示这个位置没有点。从而1行就需要8个比特位,而8个比特就是1个字节,也就是说,这个点阵字体中,一行的数据需要1个字节来存放。第1行的数据存放在点阵数据的第1个字节里面,第2行的数据存放在点阵数据的第2个字节里面,然后后面的就以此类推了。这样我们可以计算 8*8的点阵出存放一个点阵总共需要8个字节。
再比如 24*24 的点阵,意思是说每1行有24个点,一共有24行。由于1个点使用1个比特位来表示,如果这个比特位的值为1,则表示这个位置有点,如果这个比特位的值为0,则表示这个位置没有点。从而1行就需要24个比特位,而8个比特就是1个字节,也就是说,这个点阵字体中,一行的数据需要3个字节来存放。第1行的前8个点的数据存放在点阵数据的第1个字节里面,第1行的中间8个点的数据存放在点阵数据的第2个字节里面,第1行的后面8个点的数据存放在点阵数据的第3个字节里面。第2行的前8个点的数据存放在点阵数据的第4个字节里面,第2行的中间8个点的数据存放在点阵数据的第5个字节里面,第2行的后面8个点的数据存放在点阵数据的第6个字节里面,然后后面的就以此类推了。这样我们可以计算 24*24的点阵出存放一个点阵总共需要72个字节。
最后也有比较特殊的字体,它不是8的倍数----
比如 12*12 的点阵,意思是说每1行有12个点,一共有12行。由于1个点使用1个比特位来表示,如果这个比特位的值为1,则表示这个位置有点,如果这个比特位的值为0,则表示这个位置没有点。从而1行就需要12个比特位,而8个比特就是1个字节,也就是说,这个点阵字体中,一行的数据需要1个半字节来存放。但是数据的读取一般都是以字节为单位,这样也是为了方便读字库。因此这里的格式是:第1行的前8个点的数据存放在点阵数据的第1个字节里面,第1行的后面4个点的数据存放在点阵数据的第2个字节的高4位里面,而第2个字节的低4位全部补0。第2行的前8个点的数据存放在点阵数据的第3个字节里面,第2行的后面4个点的数据存放在点阵数据的第4个字节的高4位里面,而第4个字节的低4位全部补0。然后后面的就以此类推了。这样我们可以计算 12*12的点阵出存放一个点阵总共需要32个字节。
这样我们可以得出一个 m*n 的点阵所占用的字节数为 (m+7)/8*n。
------------第二部分是显示字体在存储数据中的寻址--------
首先是如何在汉字库中寻址某个汉字的点阵数据了。要解决这个问题,首先需要了解汉字在计算机中是如何表示的。在计算机中英文可以使用 ASCII码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展 ASCII 码来表示一个汉字。一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码。一个汉字由两个扩展 ASCII 码组成,第一个扩展 ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码。在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字。在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中又是按照位的顺序来存放的。在汉字的编码中,汉字区位码的存放是在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体的说就是:
第一个扩展ASCII码= 128+32 + 汉字区码
第二个扩展ASCII码= 128+32 + 汉字位码
如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:
区码 = hz[0] - 128 - 32 = hz[0] - 160
位码 = hz[1] - 128 - 32 = hz[1] - 160。
汉字点阵数据在字库文件中的偏移 = ((区码-1) * 94 + 位码) * 一个点阵字模占用的字节数
英文使用的就是 ASCII码,其码值是0到127,寻址公式为:
英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字节数。