C语言输出汉字字库中的文本(使用 putpixel画点函数显示)

先明确下汉字在机内的表示
1.机内码出现的原因:
机内码的出现是为了解决ASCII码和国标码同时使用时产生二义性的问题;
2.机内码的表示:
国标码的机内码为二字节长的代码,它是在相应国标码的每个字节最高位上加“1”,即汉字机内码=汉字国标码+8080H,其高字节由该汉字的区码+A0H,低字节由该汉字的位码+A0H。
3.汉字16*16点阵:
C语言输出汉字字库中的文本(使用 putpixel画点函数显示)_第1张图片
代码如下:

  #include 
  #include 
  
  int  getbit(unsigned char c,int n)
  {return ((c>>n)&1); 
   }

  void puthz16(int qm,int wm)
  {
   long recordnum;
   int i1,i2,i3;
   int py=1,x=200,y=200;
   char by[32];//字符型占一个字节 
   FILE *fp;
   fp=fopen("C:\\计算机图形学\\hzk16","rb");//hzk16为汉字字库文件 
   recordnum=(qm-py)*94+wm-1; //16*16点阵汉字字模的32个字节称为一个记录。由汉字的区位码可求得该字在字库中的记录号。
   recordnum=recordnum*32;//记录号*32,即得到该字在16*16字库中字模的第一字节的位置
   fseek(fp,(long)recordnum,0);
   fread(by,32,1,fp);
   for(i1=0;i1<16;i1++)//i1代表点阵第几行 
       for(i2=0;i2<2;i2++)//i2代表第几个字节 
	 for(i3=0;i3<8;i3++)//i3代表 
	 if(getbit(by[i1*2+i2],7-i3))//判断若为1,则进行putpixel画点 
	    putpixel(x+i2*8+i3,y+i1,WHITE);
    }
    //还可以将汉字放大两倍(根据需要)显示,即一个像素点变成四个像素点
    /*  {
    	putpixel(x+i2*16+2*i3,y+2*i1,WHITE);
	    putpixel(x+i2*16+2*i3+1,y+2*i1,WHITE);
	    putpixel(x+i2*16+2*i3+1,y+2*i1+1,WHITE);
	    putpixel(x+i2*16+2*i3,y+2*i1+1,WHITE);}*/

   int main()
   {initgraph(500,500);
    puthz16(16,1);//根据汉字区位码传参 
    getch();
    closegraph();
    return 0;
 }

汉字区位表可直接查询到
字库文件下载

你可能感兴趣的:(计算机图形学,C语言)