stchou 发表于 2013-2-7 03:47:50

超级详细解析——字模

<div class="Section0">超级详细解析——字模

一、简介

汉字库:
即存储汉字的仓库。现在常使用的汉字库有 HZK16、HZK24、HZK32...即对应的16*16、24*24、32*32汉字点阵字库。16X16点阵方式是最基础的汉字点阵,存储一、二级汉字及符号8836个,需要 282.5 kB的容量;而32X32点阵存储8836个汉字,需要1.132MB存储容量。由上我们看出,字型库存储容量大是汉字信息处理的特点。所以多数汉字信息处理系统把汉字库放在磁盘上,
 
 
字模:
字模点阵码的点阵规模除16X16、24X24点阵外,还有32X32、64X64、128X128点 阵,甚至更高的512X512点阵。点阵规模小,分辨率差,字形不美观,有些笔划复杂的字和繁体字难以表示,但所需存储容量小,易于实现;点阵规模大,则分辨率高,字形美观,但所需存储容量大。
 
简单来说,大家应该熟悉 windows的造字程序吧。

http://dl.iteye.com/upload/attachment/482886/becf434c-57b6-3279-8f4c-99c96f8221cc.jpg
 
就是类似上图的东西。
 
二、汉字库文件

常用的汉字库文件有   HZK16、HZK24、HZK32、HZK161等等,所对应的汉字,之上的简介已经说得很清楚了。
文件解析:

  总所周知,中文字符都是使用两个字节构成的,故,我们可以简称问  
   高八位   字节一
   第八位   字节二
Java写发为:
 
 
byte iHigh, iLow;//高8位,低8位iHigh = (byte) (data);iLow = (byte) (data); 
每一个汉字在字库文件中的对应偏移量都具有一个公式,比如HZK16来说
则是:
 
IOffset  =  [(低八位-0xa1)*94(十进制)+(高八位-0xa1)]*32(十进制) 
 
0xa1为16进制,对应十进制就是:161
 
 
当然,要显示不同点阵的字模,只需要查询不同的ZK偏移量就可以了
 
 
 
 
Java代码为:
 
 
int IOffset;//文件偏移量IOffset = (94*(iLow+256-161)+(iHigh+256-161))*sum;//+256防止byte值为负   汉字字模在字库中的偏移地址fis.read(new byte);//偏移一个量纲 
得到了文字起始地址后就能得到文字的字节码了,即包含 16*2 个的字节
byte iBuff[] = new byte;//连续读入fis.read(iBuff); 
 
 
 
 
三、字模打印

显然,将取得的iBuff数组转化就可以答应16进制的出来了
而java有一个Integer.toHexString直接转化为16进制字符串了。
String h16 = Integer.toHexString(iBuff);//16进制字串 
 
 
 
打印格式  C语言格式为'0X'开头,汇编为'H'结尾  所以打印出来就可以了
showC.setText(showC.getText()+"0X"+h16.charAt(length-2)+h16.charAt(length-1)+",");showHB.setText(showHB.getText()+h16.charAt(length-2)+h16.charAt(length-1)+"H,"); 
 
 
 
四、字模画

即将每一个16进制的二进制位上为 1 的 以一个 ○ 为代表画出来到窗体上即可。
/** * 画出一个字模 * @param mat 16进制字模组 * @param matsize 字模size */public void drawHZ(byte mat[],int matsize){//画出点阵图int radix=10;//画出圆的直径int i, j, k;for(i=0;i<size;i++)               /*16x16点阵汉字,一共有16行*/{    for(j=0;j<2;j++)                /*横向有2个字节,循环判断每个字节的*/      for(k=0;k<8;k++)          { if((mat&(0x80>>k))>=1){   //判断一个二进制位上为 1 则打印 System.out.print("#"); g.fillOval(j*radix*8+k*radix+80,i*radix+320,radix,radix);} else{ System.out.print(".");g.drawOval(j*radix*8+k*radix+80,i*radix+320,radix,radix);}      }    System.out.println();}} 
运行就可以显示了:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
中文:
http://dl.iteye.com/upload/attachment/482889/b28acc07-4c47-3ab3-a0a7-6559e6bae565.jpg
 
 
日文:
http://dl.iteye.com/upload/attachment/482888/a7c0e082-5f5e-3197-a2d7-ca5c2bcf4a1b.jpg
 
标点:
http://dl.iteye.com/upload/attachment/482892/b309076a-e001-38fb-bd11-84d72f86b1b3.jpg
 
 
数字:

http://dl.iteye.com/upload/attachment/482894/5c9f13fc-d55a-3770-b347-6dddf3e7dc77.jpg
 
 
 
数学符号:

http://dl.iteye.com/upload/attachment/482896/2bb401cc-c262-39c6-a086-8a9d10779dff.jpg
 
 
 
五、应用

不用说,大家看到图像就能想起来应用时什么了吧。呵呵~
 
 
 

http://dl.iteye.com/upload/attachment/482898/aca3c461-eefc-33b4-a960-0da2a4a193ca.jpg
 
页: [1]
查看完整版本: 超级详细解析——字模