自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析 Qt 字庫移植并能顯示中文 (下篇)

移動開發(fā)
本文介紹的是Qt 字庫移植并能顯示中文,需要的字體庫文件,一般是多個。具體移植那一個,看你使用的字庫是什么了,先來看內(nèi)容。

解析 Qt 字庫移植并能顯示中文 (下篇)是本節(jié)介紹的內(nèi)容,接著上篇 解析 Qt 字庫移植并能顯示中文 (上篇)繼續(xù)介紹,爛來看本節(jié)內(nèi)容。

1、幾種格式字庫的簡介

QT支持四種格式的字庫(TTF,BDF,PFA/PFB,QPF)(見參考文獻[3]),但在產(chǎn)品中,如果直接使用,TTF或PFA/PFB。即讓應(yīng)用程序在顯示的時候再計算點陣,最終的效果并不理想,會發(fā)現(xiàn)有些字大,有些字小,而且需要占用非常多的FLASH和內(nèi)存,速度也有點慢,所以我在此不想過多的介紹PFA/PFB。如果直接使用BDF,速度非常慢,而且需要占用比較多的FLASH和內(nèi)存;使用QPF,速度和占用其它資源是最小的,因此我們最終的產(chǎn)品中采用QPF格式。下面我簡單介紹,TTF,BDF和QPF字體的結(jié)構(gòu),這樣就比較容易理解后面的轉(zhuǎn)換過程。

(1)TTF字體

TTF(TrueType Font)是Apple公司和Microsoft公司共同推出的字體文件格式,隨著Windows的流行,已經(jīng)變成最常用的一種字體文件表示方式。TTF 字體已經(jīng)成功用在Windows中文版生成漢字字庫,此字體采用二次B樣條曲線來描述字符輪廓,對字符輪廓的上的點,按順時針方向從小到大編號,填充部分在其右邊。TTF文件結(jié)構(gòu)分成三個部分:文件名(12Bytes),描述表目錄(每個16Bytes),描述表數(shù)據(jù)。

對于每一個字,都有一個假想的矩形框,正常情況字是不會超出這個矩形框的,中文屬于象形字,不象英文,大小不一致,比如:英文中的f就可能會超出矩形框。微軟把矩形的高度稱為EM,實際字符的高度稱為BODY.矩形框最原始的坐標(biāo)系是矩形的中心為原點,但為了實際字體在打印和顯示的使用過程中的方便,通常將坐標(biāo)原點放在左下角,或中下。

通常,在實際打印過程中,TTF字體是用像素來度量的,如何將矩形框中的字體轉(zhuǎn)成像素呢?有一個計算公式,實例如下:如果18個點的72點每英寸屏下有一個550的長度,矩形框內(nèi)有2048個單位。那其像素為550*18*72/72/2048=4.83像素。顯然,每英寸里的點取的越多,字就越逼真,同時這樣的存儲空間和計算的時間也就越多。在嵌入程序開發(fā)過程中,這往往是不可以接受的,因為嵌入式系統(tǒng)的硬件資源本來就很有限,如果真的這樣的話,在顯示過程會很慢。并且如果為了提高速度而減少每英寸中的點數(shù),則字體失真的情況很嚴重。更加具體的關(guān)于,TTF字體的內(nèi)容可見參考資料[3]。

另外,在Windows下編程,Microsoft實現(xiàn)了讓用戶對字體操作處理具有透明性,有關(guān)字體結(jié)構(gòu)定義見參考文獻[4]。

(2)BDF字體

BDF(Bitmap Distribution Format)是在X窗口系統(tǒng)中的一種表示位圖字體的文件格式。是X協(xié)會定義的一種標(biāo)準(zhǔn),是ASCII文件它由兩部分組成,一是表示字體整體屬性的文件頭信息;二是每一個字符獨有的屬性和位圖數(shù)據(jù)。我以16*16的位圖字體為例描述BDF字體文件格式。

  1. STARTFONT2.1 /*后面跟一個版本號,指出該字體文件版本*/  
  2. COMMENT /*表示注釋*/  
  3. FONT -adobe -courier -bold -r -normal -16 -160 -75 -75 -m -160 -gb2312.1980 -0   
  4. /*表示字體名*/  
  5. SIZE 16 75 75 /*字符大小與在X,Y方向上的分辨率*/  
  6. FONTBOUNDINGBOX 16 16 0 0 /*X方向上寬度與Y方向高度及x和Y方向上的偏移*/  
  7. STARTPROPERTIES 16 /*設(shè)置字體的屬性項目數(shù)*/  
  8. FOUNDRY "Adobe" /*字體的制造廠家*/  
  9. FAMILY_NAME "Courier" /*字體的變種字型*/  
  10. WEIGHT_NAME "Bold" /*字體的印刷權(quán)*/  
  11. SLANT "R" /*字體字型的設(shè)計情況*/  
  12. SEWINDTH_NAME "Normal" /*字體的縮放因素*/  
  13. ADD_STYLE_NAME "" /*唯一的標(biāo)識該字體,一般為空*/  
  14. PIXEL_SIZE 16 /*依賴于設(shè)備的字體尺寸*/  
  15. POINT_SIZE 160 /*設(shè)計字體的實際尺寸*/  
  16. RESOLUTION_X 75 /*設(shè)計字體的水平分辨率*/  
  17. RESOLUTION_Y 75 /*設(shè)計字體的垂直分辨率*/  
  18. SPACING "m" /*指出字符寬度是定長還是可變*/  
  19. AVERAGE_WIDTH 160 /*字體中所有字符的平均寬度*/  
  20. CHARSET_REGISTRY "gb2312.1980" /*字符集名*/  
  21. CHARSET_ENCODING "0" /*字符集編號*/  
  22. FONT_DESCENT 0 /*基線下的高度*/  
  23. FONT_ASCENT 16 /*基線上的高度*/  
  24. ENDPROPERTIES /*屬性項設(shè)置結(jié)束*/  
  25. CHAR 6775 /*字體文件中的字符數(shù)*/  
  26. STARTCHAR 啊 /*字符起始標(biāo)志及名稱*/  
  27. ENCODE 3021 /*X服務(wù)器在存取該字符時使用的編碼。如漢字國標(biāo)碼*/  
  28. SWIDTH 1000 0 /*X和Y方向上的邏輯寬度和高度*/  
  29. DWIDTH 16 0 /*字符在x和Y方向上的設(shè)備單位寬度*/  
  30. BBX 16 16 0 0 /*字符邊界框的寬度,高度以及偏移*/  
  31. BITMAP /*字符的位圖的信息起始標(biāo)志*/  
  32. 0000 /*字符位圖*/  
  33. 04a0  
  34. ……  
  35. 0590  
  36. ENDCHAR /*字符結(jié)束標(biāo)志*/  
  37. STARTCHAR 阿 /*第二個字符開始*/  
  38. ……  
  39. ENDFONT /*BDF字體文件結(jié)束標(biāo)志*/ 

(3) QPF字體簡介

QPF格式的字庫是僅用于QT/Embedded的不可縮放的字體,在程序運行過程中,對TTF格式的字體,在第一次裝入使用時,都要以給定的字體大小進行處理;而對于BDF字體,當(dāng)其使用時,所有字體都必須被處理;而對于QPF字體,均以相同格式的存儲。所以在字體顯示時,Qt只要讀取字體,做相應(yīng)分析,然后顯示就完成了,這樣進一步減少了對RAM資源的浪費。QPF字體是基于UNICODE編碼的,這為QT/Embedded良好的可移植性奠定了基礎(chǔ)。有關(guān)QPF更詳細的資料可以查閱參考文獻[5]。

2、如何從TTF字體文件轉(zhuǎn)成QPF字體文件

(1)把TTF轉(zhuǎn)換成BDF

盡管不推薦使用TTF格式的字庫,但由于TTF格式的字庫可以轉(zhuǎn)換成任意大小的BDF字庫,而可以找到的BDF字庫都是固定大小的,因此在實際制作QPF字體文件時,還是需要TTF格式的字庫。把TTF轉(zhuǎn)換成BDF的方法如下:

  1. ./ttf2bdf source.ttf -p yourSize -o destination.bdf 

即利用軟件ttf2bdf可以把源文件source.ttf轉(zhuǎn)換成大小為yourSize的BDF格式的文件destination.bdf。那在程序內(nèi)部是如何實現(xiàn)將TTF轉(zhuǎn)成BDF的呢?由2.2.1和2.2.2的介紹,并且查閱參考文獻[3],可以知道TTF的內(nèi)部存儲結(jié)構(gòu)。其中最核心的部分是 TTF文件格式中的12個字節(jié)的文件表:表目錄按tag以升序排列。

  1. Type Name Description   
  2. ULONG  tag 4字節(jié)的標(biāo)識   
  3. ULONG checkSum 表中的CheckSum   
  4. ULONG offset TrueType font文件的起始偏移量Offset   
  5. ULONG length 表長  

還有一個有關(guān)Offset表的信息,包括版本號,表的數(shù)量,查找范圍。入口選擇,轉(zhuǎn)換范圍。

通過操作文件表,將描述表中的數(shù)據(jù)取出來,按照BDF字體所定義的格式寫入,就可以生成對應(yīng)的字體。比如,可以給出一小段c語言程序,此程序用于計算當(dāng)前CheckSum的位置。

  1. ULONG  
  2. CalcTableChecksum(ULONG *Table,ULONG Length)  
  3. {  
  4. ULONG Sum = 0L;  
  5. ULONG *Endptr=Table+((Length+3)& ~3)/sizeof(ULONG);  
  6. while(Table<EndPtr)  
  7. Sum += *Table++;  
  8. return Sum;  

利用此程序可以將每個字體的信息分開,并將每個字體信息從文件中取出來,對每個字體進行操作。在從TTF轉(zhuǎn)到BDF過程中,僅通過使用WINDOW的函數(shù)是很不方便的,最方便的辦法是使用c語言對字體進行操作。我在此列出轉(zhuǎn)換過程中最重要的幾個值:PIXEL_SIZE,POINT_SIZE,RESOLUTION_X,RESOLUTION_Y,F(xiàn)ONT_DESCENT,F(xiàn)ONT_ASCENT,SWIDTH,DWIDTH,BBX。這些值決定著最后生成的BDF字體與TTF字體的失真度,因為TTF是可縮放的,而BDF是固定大小的,所以在轉(zhuǎn)換過程中一定會出現(xiàn)失真的情況。

(2)對得到的BDF文件進行調(diào)整

由于從軟件xmbdfed里得到的三個字庫不符合系統(tǒng)的要求,因此需要手動對其進行一些調(diào)整,其它方法得到的BDF文件不需要進行調(diào)整。

直接從xmbdfed里得到的字庫是按照GB2312-80.0進行編碼的,因此首先要將其轉(zhuǎn)換成符合UNICODE編碼,這需要用到我手動寫的一個程序 gb2unieode,把源文件拷貝到gb2unicode程序的目錄下,將其名字改為hanzist24a.txt(程序的要求,也可以不改名字而修改程序里源文件的名字再重新編譯),然后運行./change之后,就完成了,因為QT中因現(xiàn)成的轉(zhuǎn)換函數(shù)可以調(diào)用,在此我不想多說關(guān)于用程序轉(zhuǎn)換的代碼。因為有一種更簡單的方法,即在Word中打開GB字庫。然后另存為UNICODE字庫文件就行了。

等待該命令執(zhí)行完后(注意需要的時間比較長),對所生成的文件dest.txt進行排序,方法如下:把dest.txt的名字改為dest.bdf(只要后綴名為bdf就行);然后運行軟件xmbdfed,用其打開該文件(xmbdfed只能直接打開后綴明為bdf的文件),另存為 yourname.bdf即可。排完序后需要手動修改處理yourname.bdf。

由上面介紹的BDF字體格式,現(xiàn)在對轉(zhuǎn)換得到的BDF字體文件進行如下手工處理:先刪除行說明屬性默認的字符的行DEFAULT_CHAR 8481,因為從GB2312轉(zhuǎn)換成UNICODE后,編碼為8481的字符已經(jīng)不存在了,如果不刪除該行,運行時會出現(xiàn)段錯誤。然后刪除那些存在于兩個16號字庫但在標(biāo)準(zhǔn)GB2312中沒有的一些字模。標(biāo)準(zhǔn)GB2312中有7445個字模,而兩個16字庫有7612個字模,多出來的那部分在用 gb2unicode轉(zhuǎn)換的時候因為找不到相應(yīng)的GB2312碼而沒有寫進dest.txt的字模開始行"STARTCHAR ****"。可以用xmbdfed打開,如果出錯則說明還有一些不完整的字模,還需要手動刪除這些不完整的字模,如果可以正確打開則說明目標(biāo)文件已經(jīng)是正確的。(24號字庫不存在這個問題,因此不需要進行本項操作。)最后從其它大小相同的.bdf文件中拷貝編碼為20-7F(ASCII碼)和編碼為 FE54(分號;)的字模到目標(biāo)文件。

(3)把TTF.BDF轉(zhuǎn)換成QPF

從參考文獻[5]中可以知道QT提供的把TTF,BDF轉(zhuǎn)換成QPF的方法有兩種,一種是工具makeqpf,這個命令無論是在Pc機上還是在開發(fā)板上都沒有效果(但是QT的官方網(wǎng)站卻說是可以的,不知道為什么,并且,也不是每個版本的QT都有makeqpf這個工具,還要說明的是,文獻[6]中說這個工具是可以的,不過我沒有試驗成功)。

另一種是運行應(yīng)用程序時加上選項-savefonts,如在開發(fā)板上運行應(yīng)用程序的命令:./sulfur -qws -savefonts

如果此時系統(tǒng)中/usr/qt/lib/fonts目錄下沒有QPF格式的字庫而只有TTF或BDF格式的字庫,對應(yīng)的文件fontdir中只保留要轉(zhuǎn)換的文件的行,QT就會在運行時首先生成QPF格式的字庫。盡管通過TTF字體也可以得到QPF字體,不過最好不要這樣做,因為失真太大。

小結(jié):Qt 字庫移植并能顯示中文 (下篇)的內(nèi)容到這里就介紹完了,經(jīng)過本人對字庫進行上述處理后,就可以在嵌入式開發(fā)板上顯示各種字體,只要找到給定TTF或BDF的字庫,如果找不到BDF字庫,可以找到字庫,然后通過 TTF2BDF這個程序來得到BDF字庫。這樣在開發(fā)板上可以顯示行書,楷書等字體,并且字體顯示也很正常,不會出現(xiàn)大小不一致的問題。但是,本人認為,由于這是嵌入式開發(fā),存儲資源非常有限,如果能進一步將字庫縮小,只留下程序中所要用的漢字組成的字庫就好了,這是需要下一步研究的方向。最后希望本文能幫你解決問題。

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-30 15:51:39

2011-06-17 09:34:02

Qt 4.5.1 Sqlite 移植

2011-06-27 10:28:45

Qt 網(wǎng)絡(luò) TCP

2011-06-21 15:58:20

Qt 數(shù)據(jù)庫

2011-06-29 10:46:01

Qt Eembedded Linux

2011-06-24 13:08:34

Qt Qt 4.5.3 移植

2011-06-17 10:19:11

Qt QWidge QSetting

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-13 11:24:55

QT MPlayer 移植

2011-06-13 16:16:32

Qt 中文問題

2011-06-13 11:07:22

QT 移植

2011-06-23 18:16:59

Qt Qtopia

2011-07-01 14:20:59

Qt 事件

2011-07-05 18:40:19

QT 信號 機制

2011-04-07 17:43:37

Shapping

2011-06-22 14:47:51

QT 多線程 QObject

2011-04-07 17:54:22

Policing

2011-06-17 17:16:01

Qt Eclipse Linux

2011-06-17 13:39:47

Qt 文件

2011-06-27 13:49:43

Qt 數(shù)據(jù)庫 QSqlQueryM
點贊
收藏

51CTO技術(shù)棧公眾號