点阵字体 ASCII码 汉字库 自我学习 简单总结


        学习各种大小点阵字体显示,参考网上资料,简单记录一下!

-----第一部分-----点阵字体数据的存放格式----

        最常见的是 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码 * 一个英文字模占用的字节数。

        

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值