字模提取原理

上传人:ji****72 文档编号:37670336 上传时间:2018-04-20 格式:DOC 页数:8 大小:39.50KB
返回 下载 相关 举报
字模提取原理_第1页
第1页 / 共8页
字模提取原理_第2页
第2页 / 共8页
字模提取原理_第3页
第3页 / 共8页
字模提取原理_第4页
第4页 / 共8页
字模提取原理_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《字模提取原理》由会员分享,可在线阅读,更多相关《字模提取原理(8页珍藏版)》请在金锄头文库上搜索。

1、5.7点阵字模生成原理与方法35.7.1 字模生成原理本设计中因为使用汉字的点阵显示,需要提取汉字字模,因此我们首先来了解汉字点阵字模的提取方法。汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的1616 点阵 HZK16 文件,1212 点阵 HZK12 文件等等,这些文件包括了 GB 2312 字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。下面以 HZK16 文件为例,分析取得汉字点阵字模的方法。HZK16 文件是按照 GB 2312-80 标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为 94 个区(Section),每个区

2、 94 个位(Position) ,所以也称为区位码。其中 0109 区为符号、数字区,1687 区为汉字区。而 1015 区、8894 区是空白区域。如何取得汉字的区位码呢?在计算机处理汉字和 ASCII 字符时,使每个 ASCII 字符占用 1 个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上 32(20H),第二个字节的值为位号加上 32(20H)。为了与 ASCII 字符区别开,表示汉字的两个字节的最高位都是 1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。具体算式如下:qh=c1-32-128=c1-1

3、60 wh=c2-32-128=c2-160或 qh=c1-0xa0 wh=c2-0xa0qh,wh 为汉字的区号和位号,c1,c2 为汉字的第一字节和第二字节。根据区号和位号可以得到汉字字模在文件中的位置:location=(94*(qh1)+(wh1)*一个点阵字模的字节数。那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。例如下图中显示的“汉”字,使用 1616 点阵。字模中每一点使用一个二进制位(Bit)表示,如果是 1,则说明此处有点,若是0,则说明没有。这样,一个 1616 点阵的汉字总共需要16*16/8=32 个字节表示。字模的表示顺序为:先从左到右,

4、再从上到下,也就是先画左上方的 8 个点,再是右上方的 8 个点,然后是第二行左边 8 个点,右边 8 个点,依此类推,画满 1616 个点。 对于其它点阵字库文件,则也是使用类似的方法进行显示。例如 HZK12,但是 HZK12 文件的格式有些特别,如果你将它的字模当作 12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为 8 的整数倍,于是实际该字库的位长度是 16*12,每个字模大小为 24 字节,虽然每行都多出了 4 位,但这4 位都是 0(不显示),并不影响显示效果。 还有 UCDOS 下的HZK24S(宋体)、HZK24K(楷体)或 HZ

5、K24H(黑体)这些打印字库文件,每个字模占用 24*24/8=72 字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。5.7.2 字模提取程序如果在程序中使用的汉字数目不多,也可以不必总是在程序里带上几百 K 的字库文件,也许你的程序才只有几十 K。这样可以事先将所需要显示的汉字字模提取出来,放在另一个文件里,按照自己的顺序读取文件就可以了。下面的程序说明了具体显示汉字的方法,以 1616 汉字为例,使用 HZK16 文件。 #include#include

6、/* x,y 为显示坐标,s 为显示字符串,colour 为颜色 */void hanzi16(int x,int y,char *s,int colour)FILE *fp;char buffer32; /* 32 字节的字模缓冲区 */register i,j,k;unsigned char qh,wh;unsigned long location;if(fp=fopen(“hzk16“,“rb“)=NULL)printf(“Cant open hzk16!“);getch();exit(0);while(*s)qh=*s-0xa0;wh=*(s+1)-0xa0;location=(94*

7、(qh-1)+(wh-1)*32L; /* 计算汉字字模在文件中的位置 */fseek(fp,location,SEEK_SET);fread(buffer,1,32,fp);for(i=0;i(7-k)s+=2;x+=16; /* 汉字间距 */fclose(fp);main()int gd=DETECT,gm;initgraph(hanzi16(246,200,“贵州民族学院物电学院二零零三级电子二班杨智斌!“,BROWN);getch();closegraph();在 TC 2.0 下运行上面程序,就在屏幕上打印出你想要显示的汉字,例如该程序运行后会在屏幕上显示:贵州民族学院物电学院二零

8、零三级电子二班杨智斌!程序中每次将一个汉字的点阵字模存储于 buffer32缓冲数组里面,因此我们可以编程从该缓冲数据组里面取出对应汉字的点阵模存储于另的一个数组里面,然后可以通过 PC 机串口发送给单片机,最后显示在 LED 点阵显示屏上。由于时间比较紧,这一步我没有做出来,希望有人能够补充完整,在制作过程中我是用了别人已经写好了的点阵字模提取软件来提取点阵字模。Windows API 一日一练(90)GetGlyphOutline 函数 收藏 中西文化的差异,导致在电子信息里处理也大不相同,在英文里只需要 26 个字母就可以显 示所有文章了,而在中文里需要最基本的字符就有 2000 多个。

9、对于一些在嵌入式软件里要 显示的字符,那么就得手动去构造所有图形,这是一个比较大的工作量,如果让每个厂家 都去完成这个任务,显然是不可能的。面对着大量嵌入式用户的需求,那么就需要解决中文字模的图形问题。毕竟大家经常使用 Windows,最先想到的,肯定是怎么样把里面的字 符提取图形出来,生成自己需要的几个字库。下面就来介绍怎么样用函数 GetGlyphOutline 获取显示字符的图形数据。函数 GetGlyphOutline 声明如下:WINGDIAPI DWORD WINAPI GetGlyphOutlineA( _in HDC hdc,_in UINT uChar,_in UINT fu

10、Format,_out LPGLYPHMETRICS lpgm,_in DWORD cjBuffer,_out_bcount_opt(cjBuffer) LPVOID pvBuffer,_in CONST MAT2 *lpmat2); WINGDIAPI DWORD WINAPI GetGlyphOutlineW( _in HDC hdc,_in UINT uChar,_in UINT fuFormat,_out LPGLYPHMETRICS lpgm,_in DWORD cjBuffer,_out_bcount_opt(cjBuffer) LPVOID pvBuffer,_in CONST

11、MAT2 *lpmat2); #ifdef UNICODE #define GetGlyphOutline GetGlyphOutlineW #else #define GetGlyphOutline GetGlyphOutlineA #endif / !UNICODEhdc 是设备句柄。 uChar 是需要获取图形数据的字符。 fuFormat 是获取数据的格式。 lpgm 是获取字符的相关信息。 cjBuffer 是保存字符数据的缓冲区大小。 pvBuffer 是保存字符数据的缓冲区。 lpmat2 是 3*3 的变换矩阵。调用函数的例子如下: #001 /浮点数据转换为固定浮点数。 #0

12、02 FIXED FixedFromDouble(double d) #003 #004 long l; #005 l = (long) (d * 65536L); #006 return *(FIXED *) #007 #008 #009 /设置字体图形变换矩阵。 #010 void SetMat(LPMAT2 lpMat) #011 #012 lpMat-eM11 = FixedFromDouble(2); #013 lpMat-eM12 = FixedFromDouble(0); #014 lpMat-eM21 = FixedFromDouble(0); #015 lpMat-eM22

13、= FixedFromDouble(2);#016 #017 #018 / #019 /获取字模信息。 #020 /蔡军生 2007/12/16 QQ:9073204 深圳 #021 void TestFontGlyph(void) #022 #023 /创建字体。 #024 HFONT hFont = GetFont(); #025 #026 /设置字体到当前设备。 #027 HDC hDC = :GetDC(m_hWnd); #028 HFONT hOldFont = (HFONT)SelectObject(hDC,hFont); #029 #030 /设置字体图形变换矩阵 #031 MA

14、T2 mat2; #032 SetMat( #033 #034 #035 GLYPHMETRICS gm; #036 #037 /设置要显示的字符。 #038 TCHAR chText = L蔡; #039 #040 /获取这个字符图形需要的字节的大小。 #041 DWORD dwNeedSize = GetGlyphOutline(hDC,chText,GGO_BITMAP, #042 if (dwNeedSize 0 #071 #072 else #073 #074 OutputDebugString(_T(“0“); #075 #076 #077 #078 #079 #080 #081 / #082 OutputDebugString(_T(“rn“); #083 #084 #085 / #086

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号