




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、5.7點(diǎn)陣字模生成原理與方法5.7.1字模生成原理本設(shè)計(jì)中因?yàn)槭褂脻h字的點(diǎn)陣顯示,需要提取漢字字模,因此我 們首先來了解漢字點(diǎn)陣字模的提取方法。漢字的點(diǎn)陣字模是從點(diǎn)陣字庫文件中提取出來的。例如常用的16X 16點(diǎn)陣HZK16文件,12X 12點(diǎn)陣HZK12文件等等,這些文件包 括了 GB2312字符集中的所有漢字?,F(xiàn)在只要弄清漢字點(diǎn)陣在字庫文 件中的格式,就可以按照自己的意愿去顯示漢字了。下面以HZK16文件為例,分析取得漢字點(diǎn)陣字模的方法。HZK16文件是按照GB 2312-80標(biāo)準(zhǔn),也就是通常所說的國標(biāo)碼 或區(qū)位碼的標(biāo)準(zhǔn)排列的。國標(biāo)碼分為 94個(gè)區(qū)(Section),每個(gè)區(qū)94 個(gè)位(Po
2、sition ),所以也稱為區(qū)位碼。其中 0109區(qū)為符號、數(shù)字 區(qū),1687區(qū)為漢字區(qū)。而1015區(qū)、8894區(qū)是空白區(qū)域。如何取得漢字的區(qū)位碼呢?在計(jì)算機(jī)處理漢字和ASCII字符時(shí),使每個(gè)ASCII字符占用1個(gè)字節(jié),而一個(gè)漢字占用兩個(gè)字節(jié),其值稱 為漢字的內(nèi)碼。其中第一個(gè)字節(jié)的值為區(qū)號加上32(20H),第二個(gè)字節(jié)的值為位號加上32(20H)。為了與ASCII字符區(qū)別開,表示漢字的 兩個(gè)字節(jié)的最高位都是1,也就是兩個(gè)字節(jié)的值都又加上了 128(80H)。 這樣,通過漢字的內(nèi)碼,就可以計(jì)算出漢字的區(qū)位碼。具體算式如下:qh=c1-32-128=c1-160 wh=c2-32-128=c2-1
3、60或qh=c1-0xa0 wh=c2-0xa0qh,wh為漢字的區(qū)號和位號,c1,c2為漢字的第一字節(jié)和第二字 節(jié)。根據(jù)區(qū)號和位號可以得到漢字字模在文件中的位置:location=(94*(qh 1)+(wh 1)* 一個(gè)點(diǎn)陣字模的字節(jié)數(shù)。那么一個(gè)點(diǎn)陣字模究竟占用多少字節(jié)數(shù)呢?我們來分析一下漢字字模的具體排列方式例如下圖中顯示的“漢”字,使用 16X 16點(diǎn)陣。字模中每一點(diǎn) 使用一個(gè)二進(jìn)制位(Bit)表示,如果是1,則說明此處有點(diǎn),若是0, 則說明沒有。這樣,一個(gè)16X16點(diǎn)陣的漢字總共需要16*16/8=32個(gè) 字節(jié)表示。字模的表示順序?yàn)椋合葟淖蟮接?,再從上到下,也就是?畫左上方的8個(gè)點(diǎn)
4、,再是右上方的8個(gè)點(diǎn),然后是第二行左邊8個(gè)點(diǎn), 右邊8個(gè)點(diǎn),依此類推,畫滿16X 16個(gè)點(diǎn)。對于其它點(diǎn)陣字庫文件,則也是使用類似的 方法進(jìn)行顯示。例如HZK12但是HZK12文件的 格式有些特別,如果你將它的字模當(dāng)作12*12位 計(jì)算的話,根本無法正常顯示漢字。因?yàn)樽謳煸O(shè) 計(jì)者為了使用的方便,字模每行的位數(shù)均補(bǔ)齊為 8的整數(shù)倍,于是實(shí)際該字庫的位長度是16*12, 每個(gè)字模大小為24字節(jié),雖然每行都多出了 4位,但這4位都是0 (不顯示),并不影響顯示效果。還有UCDO下的HZK24&宋體)、HZK24K(楷體)或HZK24H(黑體)這些打印字庫文件,每個(gè)字模占用 24*24/8=72
5、字節(jié),不過這類大字模漢字庫為了打印的方便, 將字模都 放倒了,所以在顯示時(shí)要注意把橫縱方向顛倒過來就可以了。這樣我們就完全清楚了如何得到漢字的點(diǎn)陣字模,這樣就可以在程序中隨意的顯示漢字了。5.7.2 字模提取程序如果在程序中使用的漢字?jǐn)?shù)目不多, 也可以不必總是在程序里帶 上幾百K的字庫文件,也許你的程序才只有幾十 K。這樣可以事先將 所需要顯示的漢字字模提取出來,放在另一個(gè)文件里,按照自己的順 序讀取文件就可以了。下面的程序說明了具體顯示漢字的方法,以 16X 16漢字為例,使用HZK16文件。#in clude<stdio.h>#in clude<graphics.h>
6、;/* x,y為顯示坐標(biāo),s為顯示字符串,colour為顏色*/void han zi16(i nt x,i nt y,char *s,i nt colour)FILE *fp;char buffer32; /* 32字節(jié)的字模緩沖區(qū)*/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;/*計(jì)算漢字字模在文件中的位置*/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,"貴州民族學(xué)院物電學(xué)院二零零三級電子二班楊智斌! ",BROWN);getch();closegraph();在TC2.0下運(yùn)行上面程序,就在屏幕上打印出你想要顯示的漢字, 例如該程序運(yùn)行后會在屏幕上顯示:貴州民族學(xué)院物電學(xué)院二零零三級 電子二班楊智斌!程序中每次將一個(gè)漢字的點(diǎn)陣字模存儲于buffer32緩沖數(shù)組里面,因此我們可以編程從該緩沖數(shù)據(jù)組里面取出對應(yīng)漢字的點(diǎn)陣模存儲 于另的一個(gè)數(shù)組里面,然后可以通過PC機(jī)串口發(fā)送給單片機(jī),最后
9、顯示在LED點(diǎn)陣顯示屏上。由于時(shí)間比較緊,這一步我沒有做出來,希望 有人能夠補(bǔ)充完整,在制作過程中我是用了別人已經(jīng)寫好了的點(diǎn)陣字模 提取軟件來提取點(diǎn)陣字模。Windows API 日一練(90)GetGlyphOutline 函數(shù)收藏中西文化的差異,導(dǎo)致在電子信息里處理也大不相同,在英文里只需要26個(gè)字母就可以顯示所有文章了,而在中文里需要最基本的字符就有2000多個(gè)。對于一些在嵌入式軟件里要顯示的字符,那么就得手動去構(gòu)造所有圖形,這是一個(gè)比較大的工作量,如果讓每個(gè)廠家都去完成這個(gè)任務(wù),顯然是不可能的。面對著大量嵌入式用戶的需求,那么就需要解決中文字模的圖形問題。畢竟大家經(jīng)常使用 Window
10、s,最先想到的,肯定是怎么樣把里面的字符提取 圖形出來,生成自己需要的幾個(gè)字庫。下面就來介紹怎么樣用函數(shù)GetGlyphOutline獲取顯示字符的圖形數(shù)據(jù)。函數(shù)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是設(shè)備句柄。 uChar是需要獲取圖形數(shù)據(jù)的字符。 fuFormat是獲取數(shù)據(jù)的格式。 lpgm是獲取字符的相關(guān)信息。cjBuffer是保存字符數(shù)據(jù)的緩沖區(qū)大小。 pvBuffer是保存字符數(shù)據(jù)的緩沖區(qū)。lpmat2是3*3的變換矩陣。調(diào)用函數(shù)的例子如下:#001 /浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換為固定浮點(diǎn)數(shù)。#002 FIXED FixedFromDouble(double d)#003#004long l;#005l = (long) (d * 65536L);#006return *(FIXED *)&l;#007#008#009/設(shè)置字體圖形變換矩陣。#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) /創(chuàng)建字體。HFONT hFont = GetFo nt();/設(shè)置字體到當(dāng)前設(shè)備。HDC hDC = :GetDC(m_hWnd);HFONT hOldFo nt = (HFONT)SelectObject(hDC,hFo nt);/設(shè)置字體圖形變換矩陣MAT2 mat2;SetMat(&mat2);GLYPHMETRICS gm;/設(shè)置要顯示的字符。 TCHAR chText = L'蔡'獲取這個(gè)字符圖形需要的字節(jié)的大小。DWORD dwNeedSize =Get
15、GlyphOutli ne(hDC,chText,GGO_BITMAP,& gm,0,NULL,&mat2);#042if (dwNeedSize > 0 && dwNeedSize < 0xFFFF)#043#044按需要分配內(nèi)存。#045LPBYTE lpBuf =(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwNeedSize);#046if (I pBuf)#047#048II獲取字符圖形的數(shù)據(jù)到緩沖區(qū)。#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計(jì)算圖形每行占用的字節(jié)數(shù)。int n ByteCou nt = (gm.gmBlackBoxX +31) >> 5) << 2;顯示每行圖形的數(shù)據(jù)。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;/按字節(jié)輸出每點(diǎn)的數(shù)據(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);輸出的結(jié)果如下: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關(guān)于孩子撫養(yǎng)權(quán)的離婚合同書
- 貨物采購合同補(bǔ)充協(xié)議
- 設(shè)備銷售與購買合同范文
- 車險(xiǎn)綜合保險(xiǎn)合同示例
- 服務(wù)合同預(yù)付款借款范本
- 歌手簽約演出服務(wù)合同
- 服裝采購代理合同
- 大型建筑機(jī)械租賃合同樣本范本
- 城鄉(xiāng)結(jié)合部三方共建項(xiàng)目合同
- 商鋪?zhàn)赓U合同規(guī)范樣本
- 磷酸鐵鋰電池工商業(yè)儲能項(xiàng)目施工組織設(shè)計(jì)方案
- 場地租賃安全管理協(xié)議書
- 震旦ad188維修手冊
- 數(shù)學(xué)物理方程(很好的學(xué)習(xí)教材)PPT課件
- 五金英語詞匯盤點(diǎn)
- 內(nèi)容講義說明案例nxt pop trainning
- GB-T-15894-2008-化學(xué)試劑-石油醚
- 工業(yè)自動化設(shè)備項(xiàng)目用地申請報(bào)告(模板)
- 作息時(shí)間調(diào)整告家長書
- 2021年羽毛球比賽規(guī)則及裁判手勢
- 標(biāo)準(zhǔn)色卡(建筑類)下載
評論
0/150
提交評論