点阵字库编程原理

来源:互联网 发布:兄弟连linux 编辑:程序博客网 时间:2024/05/16 07:02

 今天在读一个板子上的代码时看到了关于点阵字库的编程,翻遍了整个网络才找到一点资料,以下是来自网络和我自己整理的一点资料。


一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。

以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。

了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。即将汉字分为16行,每行用2个字节表示,每个字节8位,则2*8=16个位,当位为1时,表示该位显示色彩。

#include "graphics.h"
#include "stdio.h"
main()
{ int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码与位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(i*8+k,j,WHITE);

getch();
closegraph();
fclose(HZK);
}

Exemple:
?? ? if ((*str > 128) && (*(str+1) > 128))
?? ? {
?? ? ? i = *str-32-128;
?? ? ? str++;
?? ? ? j = *str-32-128;
?? ? ? if (font_mode == FONT_16_16)
?? ? ? {
?? ? ? ? fseek (HZK16_F, (94*(i-1)+(j-1))*32L, SEEK_SET);
?? ? ? ? fread (mat,32,1,HZK16_F);
?? ? ? ? ??
?? ? ? ? for(j=0;j<16;j++)
?? ? ? ? ? for(i=0;i<2;i++)
?? ? ? ? ? ? for(k=0;k<8;k++)
?? ? ? ? ? ? ? if(mat[j][i]&(0x80>>k))
?? ? ? ? ? ? ? {
?? ? ? ? ? ? ? ? SetPixel (x + i*8+k, pLoc->y + j, color, pOsd, w, h);
?? ? ? ? ? ? ? }
?? ? ? ? ? ? ? else
?? ? ? ? ? ? ? {
?? ? ? ? ? ? ? ? //ClearPixel(x + i*8+k, pLoc->y + j, bgcolor,pOsd, w, h);
?? ? ? ? ? ? ? ? if(bgflag)
?? ? ? ? ? ? ? ? ? SetPixel (x + i*8+k, pLoc->y + j, bgcolor,pOsd, w, h);
?? ? ? ? ? ? ? }
?? ? ? ? ? str++;
?? ? ? ? x+=16;
?? ? ? ? xOffset += 16;?
?? ? ? } ?


static void SetPixel (RMuint32 x, RMuint32 y, RMuint32 colour, RMuint8 *pOsd, RMuint32 w, RMuint32h)
{?
?/*if (pixel_value == 3)
?? pOsd[(y * w) + x] = 1;
?else*/
?? pOsd[(y * w) + x] = colour;
}
原创粉丝点击