点阵字库的原理Word文档下载推荐.docx

上传人:b****3 文档编号:15517664 上传时间:2022-11-03 格式:DOCX 页数:20 大小:1.02MB
下载 相关 举报
点阵字库的原理Word文档下载推荐.docx_第1页
第1页 / 共20页
点阵字库的原理Word文档下载推荐.docx_第2页
第2页 / 共20页
点阵字库的原理Word文档下载推荐.docx_第3页
第3页 / 共20页
点阵字库的原理Word文档下载推荐.docx_第4页
第4页 / 共20页
点阵字库的原理Word文档下载推荐.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

点阵字库的原理Word文档下载推荐.docx

《点阵字库的原理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《点阵字库的原理Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。

点阵字库的原理Word文档下载推荐.docx

8=1·

·

4也就是占用了2×

12=24个字节。

编码排序A0A0→A0FEA1A0→A2FE依次排列。

以12×

12字库的“我”为例:

“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。

所以在12×

12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。

其他的类推即可。

英文点阵也是如此推理。

在DOS程序中使用点阵字库的方法

 

首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"

文曲星"

之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"

点阵"

的痕迹.在PC机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"

的痕迹也就不那么明显了.

点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种二维的阵列,这个阵列中的(x,y)位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维.

那么点阵字的数据存放细节到底是怎么样的呢.其实也十分的简单,举个例子最能说明问题.比如说16*16的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面,…,然后后面的就以此类推了.这样我们可以计算出存放一个点阵总共需要32个字节.看看下面这个图形化的例子:

||1|||||||||||1||||

|||1|1||1|1|1|1|1|1|1|1|1|||

||||1|||||||||1||||

|1||||||1||||||1||||

||1|1||||1||||||1||||

|||1||||1|||||1|||||

|||||1|||1||||1|||||

||||1||||1|||1||||||

|||1||||||1||1||||||

|1|1|1|||||||1|||||||

|||1|||||1||||1|||||

|||1||||1||||||1||||

|||1|||1|||||||1|1|1||

|||||1|||||||||1|||

|||||||||||||||||

可以看出这是一个"

汉"

字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数据:

0x40,0x08,0x37,0xfc,0x10,0x08,…,当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的.

当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12*12的点阵,那么这样的点阵数据又是如何存放的呢?

其实也很简单,每一行的前面8个点存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于其他不规则的点阵,也是按照这个原则进行处理的.这样我们可以得出一个m*n的点阵所占用的字节数为(m+7)/8*n.

在明白了以上所讲的以后,我们可以写出一个显示一个任意大小的点阵字模的函数,这个函数的功能是输出一个宽度为w,高度为h的字模到屏幕的(x,y)坐标出,文字的颜色为color,文字的点阵数据为pdata所指:

/*输出字模的函数*/

void_draw_model(char*pdata,intw,inth,intx,inty,intcolor)

{

int 

i;

/*控制行*/

j;

/*控制一行中的8个点*/

k;

/*一行中的第几个"

8个点"

了*/

nc;

/*到点阵数据的第几个字节了*/

cols;

/*控制列*/

BYTE 

staticmask[8]={128,64,32,16,8,4,2,1};

/*位屏蔽字*/

w=(w+7)/8*8;

/*重新计算w*/

nc=0;

for(i=0;

i<

="

"

font="

style="

word-wrap:

break-word;

>

cols=0;

for(k=0;

k<

for(j=0;

j<

8;

j++)

if(pdata[nc]&

mask[j])

putpixel(x+cols,y+i,color);

cols++;

}

nc++;

代码很简单,不用怎么讲解就能看懂,代码可能不是最优化的,但是应该是最易读懂的.其中的putpixel函数,使用的是TC提供的Graphics中的画点函数.使用这个函数就可以完成点阵任意大小的点阵字模的输出.

接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了.要解决这个问题,首先需要了解汉字在计算机中是如何表示的.在计算机中英文可以使用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+汉字位码

如果用charhz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:

区码=hz[0]-128-32=hz[0]-160

位码=hz[1]-128-32=hz[1]-160.

这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:

汉字点阵数据在字库文件中的偏移=((区码-1)*94+位码)*一个点阵字模占用的字节数

在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了.以下是实现代码:

/*输出一个汉字的函数*/

void_draw_hz(charhz[2],FILE*fp,intx,inty,intw,inth,intcolor)

charfONtbuf[128];

/*足够大的缓冲区,也可以动态分配*/

intch0=(BYTE)hz[0]-0xA0;

/*区码*/

intch1=(BYTE)hz[1]-0xA0;

/*位码*/

/*计算偏移*/

longoffset=(long)pf->

_hz_buf_size*((ch0-1)*94+ch1-1);

fseek(fp,offset,SEEK_SET);

/*进行寻址*/

fread(fontbuf,1,(w+7)/8*h,fp);

/*读入点阵数据*/

_draw_model(fontbuf,w,h,x,y,color);

/*绘制字模*/

以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的_draw_model函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是ASCII码,其码值是0到127,寻址公式为:

英文点阵数据在英文点阵字库中的偏移=英文的ASCII码*一个英文字模占用的字节数

可以看到,区分中英文的关键就是,一个字符是ASCII码还是扩展ASCII码,如果是ASCII码,其范围是0到127,这样是使用的英文字库,如果是扩展ASCII码,则与其后的另一个扩展ASCII码组成汉字内码,使用中文字库进行显示.只要正确区分ASCII码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了.

点阵字库和矢量字库的差别

我们都只知道,各种字符在电脑屏幕上都是以一些点来表示的,因此也叫点阵.最早的字库就是直接把这些点存储起来,就是点阵字库.常见的汉字点阵字库有16x16,24x24等.点阵字库也有很多种,主要区别在于其中存储编码的方式不同.点阵字库的最大缺点就是它是固定分辨率的,也就是每种

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1