摘要:介紹了Windows圖形引擎GDI+路徑技術,提出了應用路徑技術獲取系統TrueType字庫的筆畫輪廓數據來自動繪制漢字筆順序列和各種部件的方法并編程實現。該方法可根據需要顯示GB2312字符集6 763個漢字的任意筆順和各種部件。其對漢語工具書網絡化、字符集外字處理具有實用意義。
關鍵詞:GDI+; 路徑; 筆順; 部件
中圖分類號:TP391文獻標志碼:A
文章編號:1001-3695(2007)08-0228-03
0引言
隨著Internet的發展和普及,越來越多的漢語工具書上網為漢語學習者提供查詢服務。這些網絡版工具書內容中經常要顯示漢字的筆順和各種漢字部件(包括偏旁、部首)。由于漢字數量很大,目前的計算機標準漢字字符集中既沒有把漢字基本部件字形全部包括進來,也沒有把每個漢字的筆畫分解形式包括進來。在瀏覽器中顯示漢字筆順和各種部件時,往往采用flash動畫或圖片方式來實現。采用flash動畫來演示漢字的動態書寫過程,效果形象逼真,是一種較好地表現漢字筆順的方式,但需要對每個漢字單獨制作一個flash動畫,工作量巨大,而且這些flash動畫往往只能以一種固定的方式來顯示。例如,只能演示從漢字第一筆一直到最后一筆的筆順,不能根據需要控制演示過程,如只演示前幾筆或后幾筆的書寫過程無法實現。對于用圖片方式來顯示漢字部件等字符集外的字形,也存在制作工作量大的問題,而且字形難以控制、管理和共享。例如,要顯示“練”字右半部分這個部件,一些地方需要以楷體5號字來顯示,而另外一些地方需要以仿宋4號字來顯示,用圖片實現只能針對兩種要求分別制作一個圖片,而且圖片字形精度往往只能滿足顯示的要求,打印輸出的效果很差。為了解決以上這些問題,改進字形輸出效果,本文提出了應用Windows圖形引擎GDI+的路徑技術,通過編程獲取系統TrueType字庫中的漢字筆畫輪廓數據來自動繪制字形的方法。在該方法基礎上再利用組件制作工具很容易構建顯示漢字筆順序列和各種漢字部件的軟插件在網頁中調用,為各種網絡在線漢語工具書的開發提供服務。
1應用GDI+路徑技術自動繪制漢字筆順、部件的原理
1.1GDI+路徑技術簡介
1)路徑GDI+中的一個路徑對象(GraphicsPath)是以圖形為元素的一個圖形序列。路徑中的每個圖形既可以是封閉的,也可以是開放的。這里的圖形是指若干幾何線條(直線、弧線、貝塞爾曲線等)的組合,可以被畫出輪廓線和被填充。路徑對象建立后,可以通過向路徑中追加線條或圖形來修改路徑。
2)子路徑路徑中的每個圖形也可被看做路徑,稱為子路徑。添加到路徑中的一個封閉圖形自然成為一個子路徑。也可使用StartFigure和CloseFigure成員函數來約束子路徑的范圍。StartFigure在不封閉當前圖形情況下開始一個新的子路徑;CloseFigure將當前圖形封閉后開始新的子路徑。子路徑實質也是一個路徑對象。可以把一個復雜的不規則圖形對應為路徑,再通過子路徑對其進行分解處理。
1.2筆畫輪廓數據的獲取
在Windows系統的漢字TrueType字庫中,字形輪廓均通過直線和三次貝塞爾曲線構成的圖形來描述。其中楷體_GB2312和仿宋_GB2312兩個字庫是以筆形(筆畫)為單位來描述每個漢字的字形,即一個封閉圖形對應一個筆畫輪廓。因此,通過利用GDI+路徑的成員函數AddString,可以將這兩個TrueType字庫中的字形輪廓數據對應為一個路徑對象,漢字中每個筆畫就自然對應為一個子路徑。通過編程控制路徑和子路徑的輪廓繪制與填充就可實現漢字筆順、部件的自動繪制。
由于這兩個字庫中只包含了GB2312標準字符集中6 763個漢字的筆畫輪廓數據,只能實現集內字形的筆順及相關部件的繪制。對于一般漢語工具書網絡化的應用需求而言,這些字基本還是夠用了。
1.3 漢字筆順的自動繪制
通過路徑和子路徑的繪制來實現自動顯示漢字筆順序列,具體考慮了以下幾個方面:
a)盡管楷體_GB2312和仿宋_GB2312字庫中的字形數據可以分解成筆畫輪廓,但并沒有按漢字書寫的次序來存儲,造成對應到路徑中子路徑的排列次序也并不是筆順次序。因此,繪制時要給定排列信息來控制子路徑的繪制次序與書寫順序保持一致,這樣才能滿足按筆順顯示的要求。b)顯示筆順時,根據筆畫數決定分解顯示的步數,但不同的情況下要求會不一樣。有時需要每步只顯示一筆,有時需要每步把前幾筆都顯示出來。因此,要允許根據需要選擇每步顯示的筆畫數和被填充的筆畫數。c)還要允許顯示筆順序列的起始位置、字體、字號、顏色、各步的間隔、背景方框(或田字格)等要求也能根據需要來設定。
GDI+的路徑迭代器對象(GraphicsPathIterator)可以完成對路徑中子路徑的管理和操作,通過它的成員函數SubpathCount可以獲取路徑中子路徑的總數。對于漢字路徑而言就是漢字的筆畫數。通過成員函數NextSubpath可以依次獲取路徑中的每個子路徑,從而控制子路徑的繪制和填充,也就控制了漢字筆畫的繪制。而Rewind成員函數可以使訪問子路徑的指針位置歸零,即重新回到第一個子路徑位置。通過使用Gra ̄phicsPathIterator的這些成員函數就可以靈活控制對子路徑的訪問,從而達到控制子路徑的繪制,滿足漢字筆順顯示的要求。
此外,GDI+的路徑對象有一個成員函數GetBounds,能獲得路徑(子路徑)的外接矩形數據,可用來繪制漢字的背景方框(或田字格)。漢字字體、字號、顏色等參數的設定,可以利用GDI+的其他相關對象來實現,具體實現細節見后面程序中的說明。由于漢字輪廓數據來自系統TrueType字庫,字形可根據需要實現無級縮放,滿足各種輸出精度的要求。例如“我”字運行結果如圖1所示。
1.4漢字部件的自動繪制
漢字部件是指漢字的一個組成部分,可以通過參考字及筆畫序號序列的方式來表示。其中:參考字指明要顯示的部件是該字的一部分;筆畫序號用負整數來表示;數值指明是字的第幾筆;負號表示不顯示這一筆。例如,“練1-2-3”表示“練”字去掉前三筆的剩余部分,即“練”的右半部分。利用GDI+的路徑來實現漢字部件的顯示,也是通過控制參考字路徑中的一些子路徑(筆畫)不繪制來達到顯示漢字部件的效果。具體需要三個步驟:新建一個空路徑對象作為部件路徑;把參考字路徑中除了不繪制的那些筆畫以外的子路徑,通過AddPath成員函數添加到新路徑對象中;依次繪制這個部件路徑中的子路徑。這樣得到的漢字部件往往要比原參考字的大小要小一些,坐標位置是在參考字中的位置。為了使部件保持與原參考字的起始位置和大小都相同,可使用路徑對象的成員函數Wrap,通過把部件路徑的外接矩形擴展為與參考字路徑的外接矩形大小相等,從而實現漢字部件的大小與參考字一致。例如“練”字的右部部件擴展寬度前、后的效果顯示如圖2所示。
3結束語
本文方法的實現程序在Windows XP、Visual C++ 2003.NET環境調試通過。本方法比目前普遍采用的圖片或flash動畫處理方式具有總體工作量小、輸出樣式靈活多樣、精度高、便于網絡傳輸、管理等優點。在這一方法的基礎上,可通過建立漢字書寫信息數據庫,進一步實現漢字筆畫行筆方向的自動繪制;還可通過圖形仿射變換操作來重復利用字庫中的筆畫輪廓數據自動生成標準字符集外的生僻字形、漢語教學中出現的錯字等,從而擴展顯示漢字字形的范圍,進一步提高其實用性和應用范圍。這是下一步的工作方向。
參考文獻:
[1]周鳴揚,曾潔玫.GDI+程序設計實例[M].北京:中國水利水電出版社,2004:210-237.
[2]馮萬仁,金連文.基于部件復用的分級漢字字庫的構想與實現[J].計算機應用,2006,26(3):714-716.
[3]漢字部件規范研制組.關于制定漢字部件規范的若干問題[N].計算機世界,1998-04-27.
[4]羅振聲,袁毓林.計算機時代的漢語和漢字研究[C]//計算機時代的漢語和漢字研究學術論文集.北京:清華大學出版社,1996:107118.
[5]孫家廣,楊長貴.計算機圖形學[M].北京:清華大學出版社,1995:286-289.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”