




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、5.7点阵字模生成原理与方法5.7.1字模生成原理本设计中因为使用汉字的点阵显示,需要提取汉字字模,因此我 们首先来了解汉字点阵字模的提取方法。汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的16X 16点阵HZK16文件,12X 12点阵HZK12文件等等,这些文件包 括了 GB2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文 件中的格式,就可以按照自己的意愿去显示汉字了。下面以HZK16文件为例,分析取得汉字点阵字模的方法。HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码 或区位码的标准排列的。国标码分为 94个区(Section),每个区94 个位(Po
2、sition ),所以也称为区位码。其中 0109区为符号、数字 区,1687区为汉字区。而1015区、8894区是空白区域。如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称 为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的 两个字节的最高位都是1,也就是两个字节的值都又加上了 128(80H)。 这样,通过汉字的内码,就可以计算出汉字的区位码。具体算式如下:qh=c1-32-128=c1-160 wh=c2-32-128=c2-1
3、60或qh=c1-0xa0 wh=c2-0xa0qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字 节。根据区号和位号可以得到汉字字模在文件中的位置:location=(94*(qh 1)+(wh 1)* 一个点阵字模的字节数。那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式例如下图中显示的“汉”字,使用 16X 16点阵。字模中每一点 使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0, 则说明没有。这样,一个16X16点阵的汉字总共需要16*16/8=32个 字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先 画左上方的8个点
4、,再是右上方的8个点,然后是第二行左边8个点, 右边8个点,依此类推,画满16X 16个点。对于其它点阵字库文件,则也是使用类似的 方法进行显示。例如HZK12但是HZK12文件的 格式有些特别,如果你将它的字模当作12*12位 计算的话,根本无法正常显示汉字。因为字库设 计者为了使用的方便,字模每行的位数均补齐为 8的整数倍,于是实际该字库的位长度是16*12, 每个字模大小为24字节,虽然每行都多出了 4位,但这4位都是0 (不显示),并不影响显示效果。还有UCDO下的HZK24&宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用 24*24/8=72
5、字节,不过这类大字模汉字库为了打印的方便, 将字模都 放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。5.7.2 字模提取程序如果在程序中使用的汉字数目不多, 也可以不必总是在程序里带 上几百K的字库文件,也许你的程序才只有几十 K。这样可以事先将 所需要显示的汉字字模提取出来,放在另一个文件里,按照自己的顺 序读取文件就可以了。下面的程序说明了具体显示汉字的方法,以 16X 16汉字为例,使用HZK16文件。#in clude<stdio.h>#in clude<graphics.h>
6、;/* x,y为显示坐标,s为显示字符串,colour为颜色*/void han zi16(i nt x,i nt y,char *s,i nt colour)FILE *fp;char buffer32; /* 32字节的字模缓冲区*/register i,j,k;un sig ned char qh,wh;un sig ned long locati on;if(fp=fope n("hzk16","rb")=NULL)prin tf("Ca n't open hzk16!");getch();exit(0);while(
7、*s)qh=*s-0xa0;wh=*(s+1)-0xa0;location=(94*(qh-1)+(wh-1)*32L;/*计算汉字字模在文件中的位置*/fseek(fp,locatio n, SEEK_SET);fread(buffer,1,32,fp);for(i=0;i<16;i+)for(j=0;j<2;j+)for(k=0;k<8;k+)if(bufferi*2+j»(7-k)&0x1)!=NULL)putpixel(x+8*j+k,y+i,colour);s+=2;x+=16; /* 汉字间距*/ fclose(fp);mai n()in t g
8、d=DETECT,gm;in itgraph(&gd,&gm,"");han zi16(246,200,"贵州民族学院物电学院二零零三级电子二班杨智斌! ",BROWN);getch();closegraph();在TC2.0下运行上面程序,就在屏幕上打印出你想要显示的汉字, 例如该程序运行后会在屏幕上显示:贵州民族学院物电学院二零零三级 电子二班杨智斌!程序中每次将一个汉字的点阵字模存储于buffer32缓冲数组里面,因此我们可以编程从该缓冲数据组里面取出对应汉字的点阵模存储 于另的一个数组里面,然后可以通过PC机串口发送给单片机,最后
9、显示在LED点阵显示屏上。由于时间比较紧,这一步我没有做出来,希望 有人能够补充完整,在制作过程中我是用了别人已经写好了的点阵字模 提取软件来提取点阵字模。Windows API 日一练(90)GetGlyphOutline 函数收藏中西文化的差异,导致在电子信息里处理也大不相同,在英文里只需要26个字母就可以显示所有文章了,而在中文里需要最基本的字符就有2000多个。对于一些在嵌入式软件里要显示的字符,那么就得手动去构造所有图形,这是一个比较大的工作量,如果让每个厂家都去完成这个任务,显然是不可能的。面对着大量嵌入式用户的需求,那么就需要解决中文字模的图形问题。毕竟大家经常使用 Window
10、s,最先想到的,肯定是怎么样把里面的字符提取 图形出来,生成自己需要的几个字库。下面就来介绍怎么样用函数GetGlyphOutline获取显示字符的图形数据。函数GetGlyphOutline声明如下:WINGDIAPI DWORD WINAPI GetGlyphOutli neA(_in HDC hdc,in UINT uChar,in UINT fuFormat,out LPGLYPHMETRICS lpgm, in DWORD cjBuffer, out_bcoun t_opt(cjBuffer) LPVOIDpvBuffer,);WINGDIAPI DWORD WINAPI GetGl
11、yphOutli neW(in CONST MAT2 *lpmat2_in HDC hdc,in UINT uChar,in UINT fuFormat, put LPGLYPHMETRICS lpgm, in DWORD cjBuffer, out_bcoun t_opt(cjBuffer) LPVOIDpvBuffer,in CONST MAT2 *lpmat2);#ifdef UNICODE#defi ne GetGlyphOutli ne GetGlyphOutli neW#else#defi ne GetGlyphOutli ne GetGlyphOutli neA #endif /
12、 !UNICODE hdc是设备句柄。 uChar是需要获取图形数据的字符。 fuFormat是获取数据的格式。 lpgm是获取字符的相关信息。cjBuffer是保存字符数据的缓冲区大小。 pvBuffer是保存字符数据的缓冲区。lpmat2是3*3的变换矩阵。调用函数的例子如下:#001 /浮点数据转换为固定浮点数。#002 FIXED FixedFromDouble(double d)#003#004long l;#005l = (long) (d * 65536L);#006return *(FIXED *)&l;#007#008#009/设置字体图形变换矩阵。#010 void
13、 SetMat(LPMAT2 lpMat) #011 #012lpMat->eM11= FixedFromDouble(2);#013lpMat->eM12= FixedFromDouble(O);#014lpMat->eM21= FixedFromDouble(0);#015lpMat->eM22= FixedFromDouble(2);#016 #017#018 /#019获取字模信息。#020/蔡军生 2007/12/16 QQ:9073204 深圳#021#022#023#024#025#026#027#028#029#030#031#032#033#034#0
14、35#036#037#038#039#040#041void TestFo ntGlyph(void) /创建字体。HFONT hFont = GetFo nt();/设置字体到当前设备。HDC hDC = :GetDC(m_hWnd);HFONT hOldFo nt = (HFONT)SelectObject(hDC,hFo nt);/设置字体图形变换矩阵MAT2 mat2;SetMat(&mat2);GLYPHMETRICS gm;/设置要显示的字符。 TCHAR chText = L'蔡'获取这个字符图形需要的字节的大小。DWORD dwNeedSize =Get
15、GlyphOutli ne(hDC,chText,GGO_BITMAP,& gm,0,NULL,&mat2);#042if (dwNeedSize > 0 && dwNeedSize < 0xFFFF)#043#044按需要分配内存。#045LPBYTE lpBuf =(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwNeedSize);#046if (I pBuf)#047#048II获取字符图形的数据到缓冲区。#049GetGlyphOutli ne(hDC,chText,GGO_BITM
16、AP, &gm,dwNeedSize,lpBuf, &mat2);#050-#051#052#053#054#055#056#057#058#059#060#061#062#063#064#065#066#067#068#069#070#071#072II计算图形每行占用的字节数。int n ByteCou nt = (gm.gmBlackBoxX +31) >> 5) << 2;显示每行图形的数据。for (int i = 0; i < gm.gmBlackBoxY; i+) /for (int j = 0; j < n ByteCo un
17、 t; j+) BYTE btCode = lpBufi* nByteCo unt + j;/按字节输出每点的数据。 for (int k = 0; k < 8; k+)if (btCode & (0x80»k) OutputDebugStri ng(_T("1"); else#073#074#075#076#077#078#079#080#081#082#083#084#085#086#087#088#089#090#091#092#093#094#095#096#097 OutputDebugStri ng(_T("0");
18、-/OutputDebugStri ng(_T("rn"); -/HeapFree(GetProcessHeap(),0,lpBuf);/SelectObject(hDC,hOldFo nt);DeleteObject(hFo nt);/ReleaseDC(m_hWnd,hDC);输出的结果如下:00000000000000010000000000000000 00000000110000011000000000000000 00000000100000011000000000000000 00000000100000011000011000000000 111111111
19、11111111111111100000000 01000000100000011000000000000000 00000000100000011000000000000000 00000100100000011000000000000000 00000110100000010000000000000000 00000100000000000000000000000000 00001100000001000000100000000000 00001111111101111111110000000000 00001000001111000000110000000000 00011000001000100001100000000000 00010100001000100001000000000000 00010010011000100011000000000000 00100011010000010010000000000000 00110010110000011010000000000000 01011000110000001100000000000000 10001000100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 草坪种植合同协议书
- 农村集体建设用地合作合同范本3篇
- 办公室租赁合同英文范本3篇
- 中国公民健康素养66条解析-培训课件
- 广西来宾市本年度(2025)小学一年级数学部编版能力评测((上下)学期)试卷及答案
- 2025-2030年中国数控电火花机床市场深度调研及投资潜力研究报告
- 中医内科学引言课件
- 叉车司机五级模拟题及参考答案
- 草坪建植与养护试题库(附参考答案)
- 安徽省合肥市普通高中六校联盟2024-2025学年高一下学期4月期中英语试题(原卷版+解析版)
- 2025年应急管理普法知识竞赛题(附答案)
- 《工程勘察设计收费标准》(2002年修订本)
- 广东省普通高中学生档案
- 中国民族史智慧树知到答案章节测试2023年云南大学
- 法制副校长聘书模板52426
- 钢板桩施工专项方案
- 太湖县赵氏宗谱编纂理事会章程
- 水土保持常用监测表格(共9页)
- PPT翻书动画效果的制作
- 病理学第十六章-神经系统疾病
- 股权投资邮箱
评论
0/150
提交评论