首页 百科知识 基于点阵字库的汉字显示

基于点阵字库的汉字显示

时间:2022-10-04 百科知识 版权反馈
【摘要】:显然点阵越大,汉字越美观。由于汉字形状变化多,所以通常至少需要16×16点阵,才能基本描述汉字的形状。编写程序,实现从汉字库中读取自己的姓名的点阵字形,将这些字形信息写入一个二进制文件,从而构成一个小字库。

实验目的

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.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈