《VB点阵字模提取.docx》由会员分享,可在线阅读,更多相关《VB点阵字模提取.docx(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、冶金自动化 2004年增刊 基于 VB实现的的汉字点阵字模的提取方法 范志敏,刘洁莉,补家武 (中国地质大学 (武汉 ) 机电学院,湖北武汉 430074) 摘要 具体介绍点阵字库中字模的存储结构和存储方式,给出了一种简便、实用的汉字点阵字模的提取方法以及其他 字模信息的处理方法。 关键词 汉字字库 ;字模提取 刖目 如今在工业生产和日常生活中, LED点阵屏和 LCD点阵式液晶显示屏的应用越来越广泛,如设备的操 作显示屏、手机的显示屏以及大型广告显示屏等等。然而无论是 LED点阵屏还是 LCD点阵式液晶显示屏, 若要显示汉字,都需要获得待显示汉字的点阵字模,再由单片机控制系统进行处理。获取字
2、模的最原始的 方法是手工方法。这种方法不仅工作量大、效率低,而且容易出错,而使用昂贵的通用汉字库芯片 ,对于一 般的使用者来说又很不经济。为此,本文介绍了一种简便、实用的提取汉字字模的方法,利用该方法可以从 汉字库中得到所有一级和二级汉字的点阵,方便地制作合乎自己要求的专用小型点阵汉字库。 1汉字的编码及汉字库简介 根据 GB2312 80,每个汉字都有唯一的位置编码,该编码就是字符的区号和行号的二进制代码,称 作该汉字的区位码 w。 计算机中的汉字与字符是混合在一起的,区分汉字信息与 ASCII码采取的方法 是使表示汉字的两个字节的最髙位等于 1。这种高位为 1的双字节汉字编码就称为汉字的机
3、内码,又称 内码 1。机内码与区位码之间的变换关系如下: 内码高位字节 =区码 +160;内码低位字节 =位码 +160 (1) 汉字库根据其中存储的汉字信息的不同可以分为点阵字库、矢量字库、曲线轮廓字库。根据汉字字 体的不同,每一种字库又可分为楷书、隶书、黑体、宋体等等。 点阵字库中存放着汉字的点阵字模信息。它根据点阵的大小,又可分为 16点阵字库、 24点阵字库 等。当汉字的点阵数目增加时,其显示质量越高,但所占用的存储空间也越大。在同一点阵字库中,各汉 字字模信息所占的存储空间相同,因而便于查询和提取。在矢量字库和曲线轮廓汉字库中则存放各汉字 的索引表及其笔划或字形信息。不管是点阵汉字、
4、矢量汉字还是曲线轮廓汉字,要在 LED点阵屏或 LCD 屏中显示它们,最终还是要提取它们的点阵字模信息,所以这里主要介绍点阵字库和点阵汉字。 2汉字点阵库结构 不同点阵的汉字库中字模的存储方式有所不同。在 16点阵字库中字模的存储方式是从左到右,由 上到下,如图 1所示。而在 24点阵字库中则是从上到下,从左到右,如图 2所示。 Font(0) Font(l) Font(2) Font (3) Font (30) Font(31) Font(0) Font(3) Font(69) Font Font Font(70) Font Font(5) Font(71) 图 1 16点阵字库中字模的存储
5、方式 图 2 24点阵字库中字模的存储方式 由汉字或符号的区位码可以唯一确定其在点阵字库中的起始位置,计算方法如下: 收稿日期 2003 12 23;修改稿收到日期 2004 02 20 作者简介 范志敏 (1979 ),男,湖北武汉人,硕士研究生,研究方向为机械与电子工程。 414 冶金自动化 2004年增刊 起 始 位 置 = 9 4 X ( 区码 一 1 ) + ( 位码 一 1)(2) 这里仅介绍最常用的 16点阵和 24点阵汉字字模的提取,其它小点阵字模的提取方法类似。 对于 16点阵字库,每个字模信息占用 32个字节,根据式 (1)和 (2)可知,一个汉字的字模在 16点阵 字库中
6、的起始位置可由下式求得: 起始位置 =32 X(内码髙字节 一 161)X94+(内码低字节 一 161)(3) 对于 24点阵字库,每个字模占用 72个字节,因而计算一个汉字字模在 24点阵字库中的起始位置的 公式与 (3)式类似,为: 起始位置 =72X(内码髙字节一 161) X 94+(内码低字节 一 161)(4) 在不同的 24点阵字库中,各种非汉字符号的存放方式不一样。有的省去了前 15个区 ,并将这 15个 区的符号单独存放,有的没有省去。如果省去了前 15个区 (如 UCDOS中),则其起始位置的计算公式应 修改为: 起始位置 = 72X(内码高字节 一 176) X 94+
7、(内码低字节一 161)(5) 知道了汉字字模在字库中的起始位置,进而就可以将该汉字的字模从相应的字库中取出。 3具体应用实例 下面以 16X16点阵字库为例,给出利用 Visual Basic语言提戚字模的实现方法。 首先,求得汉字的机内码: intEachWord = Asc(strEachWord) intNeiMa 65536 + intEachWord 得到机内码 然后,将得到的机内码转化为十六进制,再分别取得其髙位和低位字节: strQuMa=Mid (Hex( intNeiMa), 1, 2) intQuMa=,&H strQuMa 得到机内码的高位字节 StrWeiMa=Mid
8、(Hex(intNeiMa) ,3,2) intWeiMa=,&-HM & strWeiMa 得到机内码的低位字节 接下来,根据公式 (1)求出该汉字的区位码: strQuMa =(intQuMa_ 160) And 127 得到区码 strWeiMa = (intWeiMa-160) And 127 得到位码 再由公式 (3)计算出该汉字字模在字库中的起始位置: intStartPosition = 32 * (intQuMa 1) * 94 + intWeiMa 1) 那么,从这个起始位置顺序读取 32次,就获得了该汉字的 16点阵字模了。 提取 24或 32点阵字模的方法与提取 16点阵
9、字模类似,就不再重述。这里应注意的是 :要获得汉字 正确的点阵字模信息,必须要有相应的汉字点阵库文件 (如 HZK16等)。 如果要获得汉字的大点阵字模信息,就可以通过由图到点阵的方法。在 VB中,可以方便地利用 API函数来获取图像点阵,有关 API函数描述为: Getobject(hobject, cCount, lPobject):取得对指定对象进行说明的 一 个结构 GetBitmaPBits(hBitmap, dwCount, lPBits):将来自位图的二进制位复制到一个缓冲区用 3。 在 API浏览器加入以上两个 API函数及 BITMAP结构后,就可在程序中引用这两个函数了。
10、先将待取的汉字打印在一适当大小的图片框 (其坐标设为象素 Pixels)中,然后再进行逐点扫描,从 而获得其点阵信息。 实现代码如下: Dim bmP As BITMAP, byte Ary () As Byte Dim hBitmap,res,totbyte As long HBitmaP=Picturel. Picture. Handle res Getobject(hBitmap, Ien(bmp), bmp) totbyte=bmp. bmWidthBytes * bmp. bmHeight ReDim byteAry(todbyte 1) res=GetBitmapBits( hBi
11、tmap, totbyte* byteAry(0) 这样打印在图片框中汉字的点阵信息就存储在数组 ByteAry中了。当然,这种方法也可以直接提取 415 冶金自动化 2004年增刊 所需图片的点阵信息。 将汉字字模提取出来后,就可以根据需要进行相关的处理,如: (1) 验证字模的正确性,即将字模代码转换为二进制的字符,在为 “1” 的地方填充上与底色不同的颜 色,在为 “0” 的地方不填色 (与底色相同 ), 在图片框中将该汉字显示出来; (2) 将汉字或字符放大,可采取面积放大法或无级平滑放大法 ; (3) 由于在 LED点阵屏中显示汉字,根据显示方法可分为行扫描和列扫描,因此,可先将字模
12、代码转 换为二进制的字符,然后根据字模的存储方式和提取的需要进行组合而获得行扫描或列扫描的代码 3; (4) 保存为 TXT文件, TXT文本是较简单的众所周知纯文本格式,可以方便査看相应的字模信息; (5) 保存为 ASM文件,按照 ASM文件的格式将字模代码进行相应的处理 W ; (6) 保存为 HEX文件,将字模代码转换为二进制的字符,再根据 intel的 HEX文件格式要求进行排 列组合。 4 结 束 语 笔者在液晶显示屏上编写用户使用手册时,就是利用上述的方法提取汉字的点阵 字模,取得了良好 的效果。 参 考 文 献 1 教育部考试中心 .全国计算机等级考试三级 A类教程 M.北京 :髙等教育出版社, 1998. 2 蔡士杰,徐朝晖 .点阵汉字无级平滑放大的一种方法 ; 1.计算机学报, 1993, 16(1):77 80. 3 Micr S ft Corporatioa Basic 6. 0中文版语言参考手册 M.微软 (中国 )有限公司译,北京 :希望电子出版社 ,1998. 4 李华,孙晓民 .MCS 51系列单片机实用接口技术 M.北京 :航空航天大学出版社, 1993. 编辑:夏宁 416