[资料分享] 好东西:点阵字库读取显示程序

呱呱   2008-3-7 09:26 楼主
发现这个不错的程序,可以读取显示汉字点阵字库,如果想做个电子书之类的东东,很有参考价值,程序虽然是用TC20写的,但是DOS时代的C和单片机的很相似的,主要的公式部分看明白就行了 /****************************************************** 文件名 :All.c 描 述 :12,14,16点阵汉字显示文件 语 言 :TC2.0 作 者 :刘利国 修 改 : 日 期 :2002-11-5 说 明 :需要12,14,16点阵汉字字库的支持 ******************************************************/ #include <stdio.h> #include <graphics.h> #include <fcntl.h> #include <io.h> int hzk_p,asc_p; void open_hzk(char filename[]); void open_asc(char filename[]); void get_hz(char incode[],char bytes[],unsigned long uiSize ); void get_asc(char incode[],char bytes[],unsigned long uiSize ); void disasc(int x,int y,char code[],int color, unsigned int uiDianZhenSize); void dishz(int x0,int y0,char code[],int color, unsigned int uiDianZhenSize, unsigned int uiDuoYuBit); /*字模的大小 16*16点阵 ZI_MO_SIZE=32 14*14点阵 ZI_MO_SIZE=28 12*12点阵 ZI_MO_SIZE=24 //该变量一定为long,否则出错 */ unsigned long ZI_MO_SIZE[3]={32,28,24}; /*汉字点阵 16*16点阵 ZI_MO_SIZE=16 14*14点阵 ZI_MO_SIZE=14 12*12点阵 ZI_MO_SIZE=12 */ unsigned int DIAN_ZHEN_SIZE[3]={16,14,12}; /*多余位数(对于12*12和14*14点阵字库,该位有意义) 16*16点阵 ZI_MO_SIZE=0 14*14点阵 ZI_MO_SIZE=2 12*12点阵 ZI_MO_SIZE=4 */ unsigned int DUO_YU_BIT[3]={0,2,4}; #define ZOOMX 1 /*X方向的放大倍数,1为原始尺寸*/ #define ZOOMY 1 /*Y方向的放大倍数,1为原始尺寸*/ main() { int x=10,i; int y=10; char *s; char *filename[3]={"e:\\hzk\\hzk16","e:\\hzk\\hzk14","e:\\hzk\\hzk12"}; char *fileasc[3]={"e:\\hzk\\asc16","e:\\hzk\\asc14","e:\\hzk\\asc12"}; char code[32];/*因为不能动态定位,所以取最大值32*/ char tmpcode[3]={0}; unsigned char mask=0x80; int driver=DETECT,errorcode; int mode; int iOffset; initgraph(&driver,&mode,""); errorcode=graphresult(); if(errorcode!=0) { printf("error "); getch(); exit(1); } for(i=0;i<3;i++) { open_hzk(filename); open_asc(fileasc); s="北京惠234悦12通234电s子技术有限234公司"; while(*s!=NULL) { while(x<600 && (*s!=NULL)) { tmpcode[0]=*s; tmpcode[1]=*(s+1); if(tmpcode[0] & mask) { get_hz(s,code,ZI_MO_SIZE); dishz(x,y,code,GREEN,DIAN_ZHEN_SIZE,DUO_YU_BIT); x+=20*ZOOMX; s+=2; } else { disasc(x,y,s,LIGHTGREEN,DIAN_ZHEN_SIZE); x+=10*ZOOMX; s+=1; } } x=10; y+=20*ZOOMY; } y+=20;/*换行*/ close(hzk_p); close(asc_p); } getch(); closegraph(); } /****************************************************** 函数名称:open_hzk 函数功能:打开字库文件 传入参数:无 返 回 值:无 建立时间: 修改时间: 建 立 人: 修 改 人: 其它说明:如果失败,则直接退出程序 ******************************************************/ void open_hzk(char filename[]) { hzk_p=open(filename,O_BINARY|O_RDONLY); if(hzk_p==-1) { printf("The file HZK not exits! "); getch(); closegraph(); exit(1); } } /****************************************************** 函数名称:open_asc 函数功能:打开字库文件 传入参数:无 返 回 值:无 建立时间: 修改时间: 建 立 人: 修 改 人: 其它说明:如果失败,则直接退出程序 ******************************************************/ void open_asc(char filename[]) { asc_p=open(filename,O_BINARY|O_RDONLY); if(asc_p==-1) { printf("The file asc not exits! "); getch(); closegraph(); exit(1); } } /****************************************************** 函数名称: 函数功能: 传入参数: 返 回 值: 建立时间: 修改时间: 建 立 人: 修 改 人: 其它说明: ******************************************************/ void get_hz(char incode[],char bytes[],unsigned long uiSize ) { unsigned char qh,wh; unsigned long offset; qh=incode[0]-0xa0; wh=incode[1]-0xa0; offset=(94*(qh-1)+(wh-1))*uiSize; lseek(hzk_p,offset,SEEK_SET); read(hzk_p,bytes,uiSize); } /****************************************************** 函数名称: 函数功能: 传入参数: 返 回 值: 建立时间: 修改时间: 建 立 人: 修 改 人: 其它说明: ******************************************************/ void get_asc(char incode[],char bytes[],unsigned long uiSize ) { unsigned char qh,wh; unsigned long offset; offset=incode[0]*uiSize; lseek(asc_p,offset,SEEK_SET); read(asc_p,bytes,uiSize); } /****************************************************** 函数名称: 函数功能: 传入参数: 返 回 值: 建立时间: 修改时间: 建 立 人: 修 改 人: 其它说明:对于24*24的点阵字库,存放格式如下: 纵向存放3个字节(24位),横向存放24个字节,每个字模占72个字节 字符排列顺序如下: 1 4 7 10 ...... 2 5 8 11 ...... 3 6 9 12 ...... 对于16*16的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节没有多余的数据 纵向存放16个字节,每个字模占32个字节 字符排列顺序如下: 1 2 3 4 5 6 ...... 对于14*14的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节的后2位是多余的数据 纵向存放14个字节,每个字模占28个字节 字符排列顺序如下: 1 2 3 4 5 6 ...... 对于12*12的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节的后4位是多余的数据 纵向存放12个字节,每个字模占24个字节 字符排列顺序如下: 1 2 3 4 5 6 ...... ******************************************************/ void dishz(int x0,int y0,char mat[],int color, unsigned int uiDianZhenSize, unsigned int uiDuoYuBit ) { unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; register int x,y,row,col; register int byte; int zoomX,zoomY;/*x,y方向*/ x=x0;y=y0; byte=0; for(col=0;col<uiDianZhenSize;col++) /*列*/ { for(zoomY=0;zoomY<ZOOMY;zoomY++) /*纵向放大*/ { for(row=0;row<uiDianZhenSize;row++) /*16行(2个8位)*/ { for(zoomX=0;zoomX<ZOOMX;zoomX++) /*横向放大*/ { if((mask[byte%8]& mat[byte/8])!=NULL) { putpixel(x,y,color); } x++; /*x位置加一*/ } byte++; } byte+=uiDuoYuBit; /*去掉多余位,对于16*16点阵来说,该位为0*/ x=x0; y++;/*y坐标加1*/ byte-=16; /*重新修正byte,重复绘制y像点*/ } byte+=16; /*每次写完1行(2个字节,16位),修正byte*/ } } void disasc(int x0,int y0,char code[],int color, unsigned int uiDianZhenSize ) { unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; register int x,y,row,col; register int byte; int zoomX,zoomY;/*x,y方向*/ char mat[16]={0};/*因为不能动态定位,所以取最大值16*/ get_asc(code,mat,uiDianZhenSize); x=x0;y=y0; byte=0; for(col=0;col<uiDianZhenSize;col++) /*列*/ { for(zoomY=0;zoomY<ZOOMY;zoomY++) /*纵向放大*/ { for(row=0;row<8;row++) { for(zoomX=0;zoomX<ZOOMX;zoomX++) /*横向放大*/ { if((mask[byte%8]& mat[byte/8])!=NULL) { putpixel(x,y,color); } x++; /*x位置加一*/ } byte++; } x=x0; y++;/*y坐标加1*/ byte-=8; /*重新修正byte,重复绘制y像点*/ } byte+=8; /*每次写完1行(2个字节,16位),修正byte*/ } }

回复评论 (5)

回复: 好东西:点阵字库读取显示程序

对小液晶最有用的12点阵字库文件
点赞  2008-3-7 09:27

回复:好东西:点阵字库读取显示程序

点赞  2008-3-7 10:06

回复:好东西:点阵字库读取显示程序

点赞  2008-3-7 10:40
谢谢了!!!!!!!!!!!!!!!
点赞  2008-5-2 09:30

编辑后的文件贴上来

好东西:点阵字库读取显示程序

发现这个不错的程序,可以读取显示汉字点阵字库,如果想做个电子书之类的东东,
很有参考价值,程序虽然是用TC20写的,但是DOS时代的C和单片机的很相似的,主要的公式部分看明白就行了
/******************************************************
文件名 :All.c
描 述 :12,14,16点阵汉字显示文件
语 言 :TC2.0
作 者 :刘利国
修 改 :
日 期 :2002-11-5
说 明 :需要12,14,16点阵汉字字库的支持
******************************************************/
#include
#include
#include
#include
int hzk_p,asc_p;

void open_hzk(char filename[]);
void open_asc(char filename[]);
void get_hz(char incode[],char bytes[],unsigned long uiSize );
void get_asc(char incode[],char bytes[],unsigned long uiSize );
void disasc(int x,int y,char code[],int color, unsigned int uiDianZhenSize);

void dishz(int x0,int y0,char code[],int color, unsigned int uiDianZhenSize, unsigned int uiDuoYuBit);
/*字模的大小 16*16点阵 ZI_MO_SIZE=32 14*14点阵 ZI_MO_SIZE=28 12*12点阵 ZI_MO_SIZE=24 //该变量一定为long,否则出错 */

unsigned long ZI_MO_SIZE[3]={32,28,24}; /*汉字点阵 16*16点阵 ZI_MO_SIZE=16 14*14点阵 ZI_MO_SIZE=14 12*12点阵 ZI_MO_SIZE=12 */
unsigned int DIAN_ZHEN_SIZE[3]={16,14,12}; /*多余位数(对于12*12和14*14点阵字库,该位有意义) 16*16点阵 ZI_MO_SIZE=0 14*14点阵 ZI_MO_SIZE=2 12*12点阵

ZI_MO_SIZE=4 */
unsigned int DUO_YU_BIT[3]={0,2,4}; #define ZOOMX 1 /*X方向的放大倍数,1为原始尺寸*/
#define ZOOMY 1 /*Y方向的放大倍数,1为原始尺寸*/

main() {
int x=10,i;
int y=10;
char *s; char *filename[3]={"e:\\hzk\\hzk16","e:\\hzk\\hzk14","e:\\hzk\\hzk12"};
char *fileasc[3]={"e:\\hzk\\asc16","e:\\hzk\\asc14","e:\\hzk\\asc12"};
char code[32];/*因为不能动态定位,所以取最大值32*/
char tmpcode[3]={0};
unsigned char mask=0x80;
int driver=DETECT,errorcode;
int mode;
int iOffset;
initgraph(&driver,&mode,"");
errorcode=graphresult();
if(errorcode!=0) { printf("error "); getch(); exit(1); }
for(i=0;i<3;i++) {
open_hzk(filename); open_asc(fileasc);
s="北京惠234悦12通234电s子技术有限234公司";
while(*s!=NULL) {
while(x<600 && (*s!=NULL)) {
tmpcode[0]=*s; tmpcode[1]=*(s+1);
if(tmpcode[0] & mask) { get_hz(s,code,ZI_MO_SIZE); dishz(x,y,code,GREEN,DIAN_ZHEN_SIZE,DUO_YU_BIT); x+=20*ZOOMX; s+=2; }
else { disasc(x,y,s,LIGHTGREEN,DIAN_ZHEN_SIZE); x+=10*ZOOMX; s+=1;
} }

x=10; y+=20*ZOOMY;
}
y+=20;/*换行*/
close(hzk_p);
close(asc_p); }
getch();
closegraph();
}


/******************************************************
函数名称:open_hzk
函数功能:打开字库文件
传入参数:无
返 回 值:无
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:如果失败,则直接退出程序
******************************************************/
void open_hzk(char filename[]) {
hzk_p=open(filename,O_BINARY|O_RDONLY);
if(hzk_p==-1) {
printf("The file HZK not exits! ");
getch();
closegraph();
exit(1);
} }

/******************************************************
函数名称:open_asc
函数功能:打开字库文件
传入参数:无
返 回 值:无
建立时间:
修改时间:
建 立 人: 修 改 人:
其它说明:如果失败,则直接退出程序
******************************************************/
void open_asc(char filename[]) {
asc_p=open(filename,O_BINARY|O_RDONLY);
if(asc_p==-1) {
printf("The file asc not exits! ");
getch();
closegraph();
exit(1);
} }

/******************************************************
函数名称:
函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明: ******************************************************/
void get_hz(char incode[],char bytes[],unsigned long uiSize ) {
unsigned char qh,wh;
unsigned long offset;
qh=incode[0]-0xa0;
wh=incode[1]-0xa0;
offset=(94*(qh-1)+(wh-1))*uiSize;
lseek(hzk_p,offset,SEEK_SET); read(hzk_p,bytes,uiSize);
}

/******************************************************
函数名称:
函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明: ******************************************************/
void get_asc(char incode[],char bytes[],unsigned long uiSize ) {
unsigned char qh,wh;
unsigned long offset;
offset=incode[0]*uiSize;
lseek(asc_p,offset,SEEK_SET);
read(asc_p,bytes,uiSize);
}


/******************************************************
函数名称: 函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:对于24*24的点阵字库,存放格式如下: 纵向存放3个字节(24位),横向存放24个字节,每个字模占72个字节 字符排列顺序如下: 1 4 7 10 ...... 2 5 8 11 ...... 3 6

9 12 ...... 对于16*16的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节没有多余的数据 纵向存放16个字节,每个字模占32个字节 字符排列顺序如下: 1 2

3 4 5 6 ...... 对于14*14的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节的后2位是多余的数据 纵向存放14个字节,每个字模占28个字节 字符排列顺序如

下: 1 2 3 4 5 6 ...... 对于12*12的点阵字库,存放格式如下: 横向存放2个字节(16位),其中第二个字节的后4位是多余的数据 纵向存放12个字节,每个字模占24个字节 字符排

列顺序如下: 1 2 3 4 5 6 ...... ******************************************************/
void dishz(int x0,int y0,char mat[],int color, unsigned int uiDianZhenSize, unsigned int uiDuoYuBit ) { unsigned char mask[]=

{0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
register int x,y,row,col; register int byte;
int zoomX,zoomY;/*x,y方向*/
x=x0;y=y0; byte=0; for(col=0;col { for(zoomY=0;zoomY { for(row=0;row for(zoomX=0;zoomX {
if((mask[byte%8]& mat[byte/8])!=NULL) { putpixel(x,y,color); } x++; /*x位置加一*/ }
byte++; }
byte+=uiDuoYuBit; /*去掉多余位,对于16*16点阵来说,该位为0*/
x=x0;
y++;/*y坐标加1*/
byte-=16; /*重新修正byte,重复绘制y像点*/
}
byte+=16; /*每次写完1行(2个字节,16位),修正byte*/ } }

void disasc(int x0,int y0,char code[],int color, unsigned int uiDianZhenSize ) {
unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
register int x,y,row,col;
register int byte;
int zoomX,zoomY;/*x,y方向*/
char mat[16]={0};/*因为不能动态定位,所以取最大值16*/
get_asc(code,mat,uiDianZhenSize); x=x0;y=y0; byte=0;
for(col=0;col { for(zoomY=0;zoomY { for(row=0;row<8;row++) {
for(zoomX=0;zoomX { if((mask[byte%8]& mat[byte/8])!=NULL) { putpixel(x,y,color); }
x++; /*x位置加一*/
}
byte++;
}
x=x0; y++;/*y坐标加1*/ byte-=8; /*重新修正byte,重复绘制y像点*/ }
byte+=8; /*每次写完1行(2个字节,16位),修正byte*/
} }
点赞  2008-8-10 17:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复