幾種小字庫的創(chuàng)建方法和對應(yīng)的字模提取方式
關(guān)于點陣字庫的讀取的文章很多,這里就不再累贅了。直接讀取點陣字庫文件,雖然比較方便,但是有一定的限制。首先,完整的字庫包含超過6000個漢字,體積相對較大,而大多數(shù)時候我們只需要顯示幾百個或更少的漢字。顯然此方式不適于空間占用要求高的場合。其次,程序運行時依賴字庫,不能獨立運行。再者,為了顯示在區(qū)位相距較遠(yuǎn)的字,反復(fù)長距離移動文件指針,也影響效率。
于是,就有了所謂的“小字庫”,剔除沒有用到的字模,僅僅把需要的字模提取出來。一般是這樣的: 把字模存入特定的名稱(如以拼音方式命名)數(shù)組,要使用的時候直接從對應(yīng)的數(shù)組讀取。 優(yōu)點: 占用空間極少,讀取速度極快! 缺點: 它只適用于漢字極少的情況,和內(nèi)碼無關(guān)無法直接通過內(nèi)碼找到字摸,使用時必須手動指定非常麻煩。 直接用位圖方式 此種方式用得較少,適應(yīng)于一次顯示一整段字,且重復(fù)的字很少的情況。這個不屬于小字庫的范疇了。 通過回顧標(biāo)準(zhǔn)字庫的字摸提取方式,應(yīng)該可以找出適應(yīng)于小字庫的提取方式。 標(biāo)準(zhǔn)16*16點陣字庫的字摸提取流程
優(yōu)點: 由于字模按照標(biāo)準(zhǔn)的區(qū)位排列,如果不考慮文件指針的移動消耗,字模的定位提取是相當(dāng)方便且高效的。直接由內(nèi)碼得到區(qū)位碼,由區(qū)位碼定位文件指針。完全不用查找或者判斷。這個是標(biāo)準(zhǔn)流程,還可以直接把內(nèi)碼減去0xa1,這樣區(qū)碼和位碼可以不減1。 可以支持漢字?jǐn)?shù)量不受限制。 字模位置和區(qū)位碼相關(guān),使用方便。 缺點: 前面已經(jīng)提到,這里不再重復(fù)。 介紹完標(biāo)準(zhǔn)字庫字模提取流程,如果只提取要用到的部分字模,勢必會打亂原來的區(qū)位排列排列。不能直接用區(qū)位碼定位了。下面開始介紹針對小字庫字模提取另外三種方法。 查找法讀取字庫
查找法讀取字庫簡單流程
優(yōu)點: 額外內(nèi)存占用小,幾乎不會浪費空間。每個元素儲存一個字模,僅僅多用了兩個字節(jié)來儲存區(qū)位碼。 可以支持漢字?jǐn)?shù)量僅受內(nèi)存限制。 字模位置和區(qū)位碼相關(guān),使用方便。 缺點: 速度慢,消耗CPU資源,每讀取一個字模都必須經(jīng)過一番查找和對比。 改進:可以通過優(yōu)化查找算法,獲得稍微改善。
碼表轉(zhuǎn)換法讀取字庫
碼表轉(zhuǎn)換法讀取字庫簡單流程
由于索引表按照標(biāo)準(zhǔn)的區(qū)位生成,直接根據(jù)區(qū)位碼訪問索引表就可以得到字模位置。 優(yōu)點: 完全不用查找或者判斷,定位效率很高。 可以支持漢字?jǐn)?shù)量僅受內(nèi)存限制。 字模位置和區(qū)位碼相關(guān),使用方便。 缺點:索引表會占用額外內(nèi)存。這個可以說是最致命的也是唯一的缺點。 最糟糕的情況:所謂最糟糕的情況,你用到的字中有包含最高區(qū)碼和最高位碼的。那么他的占用空間是:94*94=8836,如果你需要使用超過256個不同的字,那占用空間就是 94*94=8836*2=17672 [因為單字節(jié)能表示的最大數(shù)是256],超過17kb,有可能超過字模本身的體積!幸好這種情況不常見。 改進:通常只要使用到的 [最高區(qū)號]*[最高位號] 就可以了。還可以優(yōu)化一下剔除低區(qū)位,這時候空間占用為使用到的 [最高區(qū)號-最低區(qū)號]*[最高位號-最低位號]??偠灾瑢τ趨^(qū)位比較集中的字,用表驅(qū)動法還是比較理想的。
Switch法讀取字庫 通過額外編制一個Switch結(jié)構(gòu)的函數(shù),給出區(qū)位碼,函數(shù)返回字模在數(shù)組中位置。建立字庫的時候,把區(qū)位碼作為case值,把字模位置作為 return 值,寫入函數(shù)。這其實是查找法的變形。 選擇法讀取字庫簡單流程
優(yōu)點: 額外內(nèi)存占用小。 字模位置和區(qū)位碼相關(guān),使用方便。 缺點: 速度慢,消耗CPU資源,每讀取一個字模都必須調(diào)用函數(shù)。 可以支持漢字?jǐn)?shù)量受case 條數(shù)限制,部分編譯器支持的case條目少。 改進:取決于不同的編譯器對Switch結(jié)構(gòu)的優(yōu)化。且較高級的編譯器支持的case條目,已經(jīng)足夠代表全部區(qū)位碼。 碼表轉(zhuǎn)換法讀取字庫源程序 Switch法讀取字庫源程序 16*16點陣字庫下載 轉(zhuǎn)載請注明出處 http://blog.csdn.net/PMind
|
|