实验目的
1.了解主要汉字字形描述技术。
2.理解汉字点阵字形描述技术的原理与存储方式。
3.掌握基于点阵字形库的汉字显示方法。
实验内容
1.根据点阵字形描述技术,写出汉字的字形点阵码。
2.编写程序读取汉字库,用“*”号输出指定的汉字。
3.编写程序对点阵汉字字形进行变形处理。
预备知识
一、点阵字形描述技术
目前汉字的字形描述技术可以分成:点阵、轮廓矢量、曲线轮廓三大类技术。其中点阵字形技术由于方法简单,还原速度快,所以一直被广泛使用,图7.1就是基于点阵字库显示汉字的LED屏。
图7.1 基于点阵字库显示汉字的LED屏
点阵字形的描述技术与位图技术类似,主要是将方块汉字看成若干个点,根据其中每个点的颜色来确定汉字,图7.2是显示一个16×16点阵“汉”字的例子,图7.3显示了一个48×48点阵“汉”字的例子。
图7.2 “汉”字16×16点阵
图7.3 “汉”字48×48点阵
显然点阵越大,汉字越美观。由于汉字形状变化多,所以通常至少需要16×16点阵,才能基本描述汉字的形状。
此时将图7.2中每个位置进行数字化描述,如果有黑点,描述为1,否则描述为0,然后可以归并这些0、1信息以字节的方式存储。如果是横向整理,则得到横向点阵,如果是纵向整理,则得到纵向点阵。横向点阵比较适用于显示器,纵向点阵比较适用于打印机。
二、点阵字库
将若干汉字的点阵码存储到一个文件中,该文件就可以被称为一个字库文件。本次实验主要用到HZK16文件,该文件中存储了GB2312—80中6763个汉字的16×16点阵的字形信息,其中汉字点阵码的排列顺序是按照GB2312—80标准来排列的。
实验原理
一、从机内码到地址码
本次实验用到的HZK16文件,包含了GB2312—80中的所有符号,GB2312—80前15个区包含多种符号,从第16个区开始才是汉字。设汉字的机内码存储在charbuff[3]的前两个字节中,那么从机内码到字符序号的转换方式如下:
unsigned int order=buff[1]-0x A1+94*(buff[0]-0x B0)+15*94;
由于在HZK16中每个字符的字形码占32字节,那么将序号乘以32就得到了汉字的地址码:
unsigned int position=order*32;
本次实验所用到的HZK48S文件是一个宋体字库,其中包含了GB2312—80中的所有汉字,但不包含前15个区的符号,所以从机内码到字符序号的转换方式如下:
unsigned int order=buff[1]-0x A1+94*(buff[0]-0x B0);
由于在HZK48S中每个字符的字形码占288个字节,那么将序号乘以288就得到了汉字的地址码:
unsigned int position=order*288;
二、在控制台输出汉字
读取一个汉字的点阵信息后,可以根据需要用多种方式进行输出。如果在控制台输出,可以用位与运算符测试字形码中指定的位:如果是0,输出空格;如果是1,输出所需要的符号。此时需要注意根据不同的点阵大小控制换行,可以输出如图7.4所示的效果。
图7.4 在控制台用“*”号输出“汉”字
如果在输出的时候,字形码中是1的位置,我们输出空格;而在字形码是0的位置,我们输出所需要的符号,那么我们可以得到一个阴文的效果。
三、对汉字作变形输出
在输出汉字的时候,我们可以对汉字进行变形输出,最常见的变形输出有横向扩展、纵向扩展、放大、缩小、添加下划线、旋转和密集处理等。
例如,将每一列重复输出两次,就可以得到横向扩展2倍的效果,如果源字库是16× 16点阵,此时实际是得到了一个32×16的汉字效果。同样类似操作也可以向纵向扩展,如果纵向扩展与横向扩展结合,可以实现汉字放大的效果。
四、小字库的制作
在有些需要汉字输出的场合,如果存储容量受限,而且输出的汉字量比较少,那么我们就可以为这些应用专门制作包含少量汉字的字形库,俗称“小字库”。
制作小字库的过程如下:
S1:输入一个需要的汉字HZ;
S2:计算出HZ在字库中的地址码;
S3:从完整字库中读取HZ的字形码并追加写入小字库文件。
不断重复上面的过程,就可以得到自己需要的小字库,但是用户需要一个数据结构存储其中每个汉字的先后顺序。
实验环境
一、操作系统
Windows 2000以上版本,例如,Windows 2000/XP/Vista/7/8/8.1/10等。
二、开发环境
Visual Studio 6.0以上版本,例如,Visual Studio 6.0/2003/2005/2008/2010/2012/2013等。
实验步骤
1.针对HZK16编写函数实现从机内码到地址码的计算,函数原型如下:
unsigned int hz2add(char hz[3])
/*
本函数用于计算一个汉字在HZK16中字形码的首地址
参数:char hz[3]为一个汉字的GB2312机内码;
返回值:为该汉字在HZK16中字形码的首地址
*/
请在实验报告中给出实现函数的代码。
2.编写程序,实现在控制台用“*”和空格输出“汉”字字形。
(1)在Visual C++6.0中建立一个简单的“Win32 Console Application”,名称为“ShowHanzi”。
(2)将前面的unsigned int hz2add(char hz[3])函数添加到该工程,然后添加必要的代码后实现让用户输入“汉”字,基于HZK16显示出该汉字,效果见图7.4。
在实验报告中给出主要的程序代码。
(3)编写程序,实现反向输出汉字(以阴文的效果输出汉字),请在实验报告中给出源程序。
(4)编写程序,实现横向2倍扩展汉字字形,请在实验报告中列出你的实现代码。
(5)编写程序,实现从汉字库中读取自己的姓名的点阵字形,将这些字形信息写入一个二进制文件,从而构成一个小字库。
思考题
1.如何为小字库构造索引从而便于检索自己所需要的汉字的字形码。
2.横向、纵向扩展同时进行可以得到放大的效果,但往往会出现锯齿效应,那如何可以降低锯齿效应,提高放大的输出质量呢?
3.为了区别一个软件的当前用户是人还是程序,大量的软件和系统提供了验证码功能。但如果验证码只是提供数字和英文字母,很容易被识别出来,请考虑如何编写一个基于汉字的验证码生成工具。
[1]尉迟治平,汤勤.论中文字符集、字库及输入法的研制[J].语言研究,2006,03:63-66.
[2]邱明锋.书法字库的设计实现与管理[J].中文信息学报,2014,v.2804:145-152.
[3]陈志成,何华灿,毛明毅.GB18030字库的解读与压缩封装程序设计[J].计算机工程与应用, 2002,18:119-121+129.
[4]黄健.基于Mini GUI的UCDOS字库接口实现[J].计算机工程,2011,v.37;No.37101:273-275+279.
[5]朱巧明,李培峰,吴娴等.中文信息处理技术教程[M].北京:清华大学出版社,2005.9.
[6]王小平,梁立新,王永燕.单片机应用中快速建立小字库的方法[J].单片机与嵌入式系统应用,2001(7):76-76.
[7]汤荣生.LCD显示点阵字库的提取[J].苏州大学学报:自然科学版,2002,18(2):45-48.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。