C语言字模问题
來源:互聯網 2010-05-11 04:05:47 評論
分類: 電腦/網絡 >> 程序設計 >> 其他編程語言
問題描述:
哪位大侠帮我解释下下面代码,越详细越好,急!!!!!
#include
#include
#include
#include
#include
#include
#define COL 2
#define ROW 2
int main(void)
{
int x,y;
char *s="崔铮";
FILE *fp;
char buffer[32];
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=DETECT,gm;
initgraph(&gd,&gm," ");
if ((fp=fopen("HZK16","rb"))==NULL)
{ printf("Can’t open HZK16,Please add it");
getch(); closegraph(); exit(0);
}
x=280; y=220;
while(*s)
{ qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L;
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp);
for (i=0;i<16;i++)
for(n=0;n
for(j=0;j<2;j++)
for(k=0;k<8;k++)
for(m=0;m
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,BLUE);
s+=2;
x+=30;
}
getch();
closegraph();
}
參考答案:
这是个ucdos里面的字库HZK16
,你分析一下他的存放点阵和对应汉字的关系.你先要知道这个点阵字库组成方式:
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
/*将那每一个汉字的区位号算出来,一个汉字两个字节,分别-a0和成他的区别码*/
offset=(94*(qh-1)+(wh-1))*32L;
/*94表达汉字有94个区得到对应的在字库的位置*32L表一个汉字点32字节,16*16除8=32/
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp);
/*读取字库到数据组*/
for (i=0;i<16;i++)
for(n=0;n
for(j=0;j<2;j++)
for(k=0;k<8;k++)
for(m=0;m
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,BLUE);
/*按字节分解,相加对应的坐标,将对应的0和1过行画点,1画点,0不画*就可以显阳形汉字,如果相反则可以看到阴形的字/
s+=2;
x+=30;
/*进行相应的放大,和偏移*/
}
getch();
closegraph();
参考:
void ReadCCLIB(unsigned char high,unsigned char low,unsigned char *buf)
{
long p;
high=high-0xa0; /* 将内码高字节转换成区位码 */
low=low-0xa0; /* 将内码低字节转换成区位码 */
/* if(high>=15) high-=6; 对压缩了10-15区的字库,要此句.如王码系统 */
p=(long)((high-1)*94+low-1)*32; /* 计算出汉字在汉字库中的起始位置 */
fseek(cclibfp,p,SEEK_SET); /* 字库定位 */
fread(buf,sizeof(unsigned char),32,cclibfp); /* 读字库32个字节 */
}
[b]分类:[/b] 电脑/网络 >> 程序设计 >> 其他编程语言[br][b]问题描述:[/b][br]哪位大侠帮我解释下下面代码,越详细越好,急!!!!!
#include
#include
#include
#include
#include
#include
#define COL 2
#define ROW 2
int main(void)
{
int x,y;
char *s="崔铮";
FILE *fp;
char buffer[32];
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=DETECT,gm;
initgraph(&gd,&gm," ");
if ((fp=fopen("HZK16","rb"))==NULL)
{ printf("Can’t open HZK16,Please add it");
getch(); closegraph(); exit(0);
}
x=280; y=220;
while(*s)
{ qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L;
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp);
for (i=0;i<16;i++)
for(n=0;n
for(j=0;j<2;j++)
for(k=0;k<8;k++)
for(m=0;m
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,BLUE);
s+=2;
x+=30;
}
getch();
closegraph();
}[br][b]参考答案:[/b][br]这是个ucdos里面的字库HZK16
,你分析一下他的存放点阵和对应汉字的关系.你先要知道这个点阵字库组成方式:
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
/*将那每一个汉字的区位号算出来,一个汉字两个字节,分别-a0和成他的区别码*/
offset=(94*(qh-1)+(wh-1))*32L;
/*94表达汉字有94个区得到对应的在字库的位置*32L表一个汉字点32字节,16*16除8=32/
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp);
/*读取字库到数据组*/
for (i=0;i<16;i++)
for(n=0;n
for(j=0;j<2;j++)
for(k=0;k<8;k++)
for(m=0;m
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,BLUE);
/*按字节分解,相加对应的坐标,将对应的0和1过行画点,1画点,0不画*就可以显阳形汉字,如果相反则可以看到阴形的字/
s+=2;
x+=30;
/*进行相应的放大,和偏移*/
}
getch();
closegraph();
参考:
void ReadCCLIB(unsigned char high,unsigned char low,unsigned char *buf)
{
long p;
high=high-0xa0; /* 将内码高字节转换成区位码 */
low=low-0xa0; /* 将内码低字节转换成区位码 */
/* if(high>=15) high-=6; 对压缩了10-15区的字库,要此句.如王码系统 */
p=(long)((high-1)*94+low-1)*32; /* 计算出汉字在汉字库中的起始位置 */
fseek(cclibfp,p,SEEK_SET); /* 字库定位 */
fread(buf,sizeof(unsigned char),32,cclibfp); /* 读字库32个字节 */
}