既然漢字的筆畫種類這麼少,為什麼不考慮只利用筆畫來生成字體文件?
漢字字體文件包含多種漢字以及其他字元,動不動就要佔用7、8MB的容量。而英文字體由於字符集小的原因,文件可能就佔用幾百KB而已。在本身硬體設備容量不大的情況下(如Pebble手錶),中文字體的容量佔有問題顯得很尷尬。所以,有什麼比較好的方法來減少漢字文件的存儲量,或者早就有字體設計師把類似幾種漢字筆畫作為字體文件的方法,只是統一規範是個很大的問題?
筆畫拼接技術在漢字字體設計中已經得到比較多的應用了,比如 Android 在 5.0 之前的系統中文字體 Droid Sans Fallback 就是利用了這項技術來大幅減少字體文件體積。但是,使用筆畫拼接技術製作的字體,質量並不算高,目前僅用於需要控制文件體積的場合——比如前面提到的 Android 的系統字體。
而即使並未使用筆畫拼接的中文字體,多數應該也是先由主設計師設計出筆畫部件,以及確定字體的結構等各項參數——比如常說的「中宮大小」——再形成一份規範,交由更多的人員利用筆畫部件進行製作。即使是使用筆畫拼接技術,怎麼去「擺放」部件也仍是人工進行的。
而這就引出一個問題——如果按照比較機械的規則來由演算法自動「擺放」,那麼會出很多問題。同樣的筆畫,在字的不同位置可能會產生不同變體,而且也通常要根據整個字的形狀來調整位置、形狀、角度等,而且還要受字體設計風格的約束。需要考慮的參數過多,是這類技術的障礙。
通過筆畫庫來自動生成漢字的字體也有:花園フォント(花園明朝) - fonts.jp。但是,這個字體的製作目的是作為學術參考,而並非設計。如果用於設計,其質量是明顯不足的。參見:如何評價免費的花園明朝體? - 中文字體
關於筆畫拼接技術,可以看看這些——- 為什麼方正蘭亭細黑「永」字這裡有個缺口? - 字體
- 列印「仿宋_GB2312」字體總在筆畫交叉處出現空心,怎麼解決? - 字體設計
當然能啊,我當年還魔改過呢(增加了「冫」底下一點的特殊筆畫、把裡面所有的矢量模板換成 ヒラギノ 的),用這系統可以生成各種奇葩比如
睡衣傳說中的不問是不是就問為什麼...
用筆畫信息來生成整個漢字字形的技術,其實已經很早就有了,要從 70 年代說起。早期的激光照排系統採用點陣方式記錄不同字體及字型大小的字形信息,黑色(有筆畫)用 1 表示,白色(無筆畫)用 0 表示。這種方法用於描述西文字形比較合適,但是用於描述漢字,代價非常大。漢字字形比西文複雜,字元數量在 8,000 個以上,遠遠超過西文字母的規模,其次又有宋黑仿楷等十多種字體,每種字體又有十多種不同的字型大小。如果將小號字的字形放大來得到大號字,則字形的邊緣會出現鋸齒,影響印刷質量。舉個例子,當照排機解析度為 29.3 線/毫米時,一個五號(10.5 磅)漢字的字身點陣尺寸為 108×108,需要 1,458 個位元組來描述,如果要包含 GB2312 的全部漢字(6,763 個),則需要的存儲空間就是 9 MB。然而這僅僅是一種字體的一個字型大小,如果字型大小為 48 磅,點陣尺寸就是 494×494,需要的存儲空間就會接近 200 MB。如果所有的字體、字型大小都用這種方式來描述,總共需要的存儲空間將超過數十億位元組,這顯然是不現實的。為了解決漢字佔用存儲空間巨大的瓶頸,國內外不少廠商都進行了研究。蒙納公司曾研究出一種黑白段壓縮方法,即不再記錄字形中的每個點陣信息,而是將點陣劃分成一行行或一列列,記錄每一行或列中黑色部分的開始位置和長度,來減少數據冗餘。這種方法確實使漢字字形的所需存儲空間下降了不少,但是仍然不能滿足印刷業的需求。因為這種方法本質上仍然是用點陣方式來描述字形,為了保證印刷質量,大號字仍然必須採用大點陣存儲,不能與小號字共用,這樣下來一個 80 MB 的磁碟只能存儲不同字體、字型大小的漢字字形約 6 萬個;另外,限於當時計算機硬體水平,字形還原速度也慢。以北大王選教授為首的一批科學工作者研究出一種筆畫輪廓壓縮技術,使漢字佔用存儲空間減少到原有點陣方式的五百分之一左右,同時保證了還原時的字形質量。這項技術的主要思想如下:① 將漢字筆畫劃分為規則筆畫和不規則筆畫;② 規則筆畫用參數表示;③ 不規則筆畫用輪廓表示。輪廓信息採用分段壓縮矢量方法來描述,使數據儘可能緊湊,進一步減少所需存儲空間。
- 1 位:筆畫識別
- 6 位:起點橫坐標
- 7 位:起點縱坐標
- 7 位:長度
- 3 位:寬度(共 7 種)
- 8 位(可選):當起點橫坐標≥64,或帶有喇叭口時,用於表示坐標最高位,或喇叭口的長度和寬度。
因此,一個黑體的橫畫只需 24 或 32 位參數即可表示,即 3 或 4 個位元組。書宋、小標宋、仿宋等其他筆畫較規則的字體,也用類似方法來描述,並將它們的所有公用規則筆畫存儲在一個編碼筆段文件里(如下圖),從而減少存儲所用空間。
那麼,不規則筆畫又如何描述呢?還是以上面的「的」字為例。最後一個筆畫「撇」(#9)的各節點坐標如下:(57, 3),(56, 10),(52, 22),(49, 28),(45, 33),(41, 37),(44, 39),(48, 43),(50, 41),(56, 32),(62, 18),(65, 10),(68, 8),(68, 7),(60, 4)。
這個筆畫共 15 個節點,你大概又會以為需要 30 個位元組吧。
其實,只要 20 個位元組。這又是什麼原理呢?在筆畫輪廓壓縮方法中,不規則筆畫是採用矢量輪廓方式描述的,即取筆畫上的一個節點作為起點,然後依次存儲後續各節點相對於前一節點的坐標。根據字形輪廓走向的特點,為了儘可能使數據緊湊,在描述中為矢量規定了方向,向右、向下為正,向左、向上為負。則四種方向可劃分為四個象限:- 第Ⅰ象限,右上方向,ΔX≥0,ΔY≤0;
- 第Ⅱ象限,左上方向,ΔX≤0,ΔY≤0;
- 第Ⅲ象限,左下方向,ΔX≤0,ΔY≥0;
- 第Ⅳ象限,右下方向,ΔX≥0,ΔY≥0。
矢量的描述採用控制位元組在前、數據在後的方法,具體如下:
① 若控制位元組的最高 2 位為 11B,表示一個不規則筆畫的起點,該位元組的剩餘 6 位與後一位元組的最高位表示起點橫坐標,後一位元組的剩餘 7 位表示起點縱坐標;② 若控制位元組的最高 2 位為 01B,表示後面若干個矢量的 ΔX、ΔY 的絕對值均小於 8,矢量的個數由控制位元組的剩餘 6 位表示;每個矢量用一個位元組表示,位元組的最高 2 位表示矢量所處的象限,中間 3 位表示 ΔX 的絕對值,剩餘 3 位表示 ΔY 的絕對值;③ 若控制位元組的最高 2 位為 00B,表示後面若干個矢量均處於同一象限,且它們的 ΔX、ΔY 的絕對值均小於 16,矢量所處的象限由控制位元組中間 2 位表示,矢量的個數由控制位元組的剩餘 4 位表示;每個矢量用一個位元組表示,位元組的高 4 位表示 ΔX 的絕對值,低 4 位表示 ΔY 的絕對值;11011100B,10000011B, //起點:X=57(0111001B),Y=3(0000011B)
00100101B, //&<16,第Ⅲ(10B)象限,5(0101B)段
00010111B,01001100B,00110110B,01000101B,01000100B,//(?1, 7),(?4, 12),(?3, 6),(?4, 5),(?4, 4)
01000011B, //&<8,3(000011B)段
00011010B,00100100B,01010010B, //(3, 2),(4, 4),(2, -2)
00010101B, //&<16,第Ⅰ(01B)象限,5(0101B)段
01101001B,01101110B,00111000B,00110010B,00000001B,//(6, ?9),(6, ?14),(3, ?8),(3, ?2),(0, ?1)
00110001B, //&<16,第Ⅱ(11B)象限,1(0001B)段
10000011B。 //(?8, ?3)
楷體等筆畫不規則的字體,以及西文字母、數字、各種符號等,都採用輪廓方式描述。系統中只需存儲五號字的字形信息,其他字型大小或長扁字都可由五號字放縮而成,再由照排控制器將輪廓字形轉換成點陣,與版面中的圖片一起在印表機或照排機上輸出,就構成了電子出版系統。
當年,就是憑藉這種高超的技術,我們自行研製的激光照排產品在印刷業中大顯神威,告別鉛與火,迎來光和電,一舉改造了傳統鉛字印刷工藝,同時以其突出的性價比,使國外同類產品幾年內紛紛退出我國市場。這不得不歸功於王選等老一批科學巨匠的智慧和貢獻。華光系統的原理樣機到四代機,以及方正 TC91 和矢量版 RIP93,都是採用筆畫輪廓壓縮方式描述字形的。從 1993 年開始,方正開始推出符合國際標準的 PostScript Level 2 解釋器,不僅支持方正系統專有的 BDPDL 格式文件(即 S2 文件),也支持國外流行的 PS、EPS 格式;筆畫輪廓壓縮描述字形存在缺點,字型大小較大時字形的曲線部分會變成一折一折的多邊形,影響字形質量;再加上當時計算機硬體水平已有所提高,存儲設備的容量已大大增加,於是,印刷行業所使用的字型檔格式逐漸被 Type 1 所取代,筆畫輪廓壓縮的方法就漸漸用得少了,宋黑仿楷等字體也改用曲線方式描述字形,原有的矢量字形就不再使用了。倉頡
--
人家問筆畫組字法,你講一堆字形矢量化,還好意思說自己不是答非所問,真是呵呵了。為什麼說倉頡呢?因為台灣倉頡就是按這個思路搞的,希望通過索引相對少量漢字組字部件形狀來描述整個漢字,不過現在可能大家也就只知道倉頡輸入法了。
朱邦復在1995年開發的「漢字字形產生器」是依輸入的倉頡碼組合成字。該系統本身收錄了已存在約六萬古今漢字(字首約六百,字身約一萬);並且可根據倉頡組字規則類推,依已有的字首、字身組合出「新字」近一千萬。此系統共佔160KB,在處理器速度450兆赫的電腦上,每秒可產生及顯示16×16之字型46,000個。字體有明、黑、圓、宋、楷、隸等,並且能任意變化大小、筆劃粗細、筆劃填充。與當今字集相較,其效率相當驚人。
-- http://zh.wikipedia.org/wiki/倉頡系統
推薦閱讀:
※下劃線和斜體適合中文排版嗎?
※像「明蘭」這樣由愛好者混合現有字體而重組、自製的中文字體有哪些?
※「方正顯仁簡體」美在哪裡?
※如何評價免費的花園明朝體?
※有哪些帶中文漢字的LOGO或者圖標設計得很糟糕?