有一種造字法宛如在玩踩地雷,這個種字型就叫Bitmap點陣字,主要就是要解決向量字型在小字時,螢幕顯示時的獨有問題。
當你把字型縮到非常非常小,這個字就不再是原本的表情了。這不是什麼美學上的深奧理論,而是造字在螢幕顯示上必然遇到的問題:中文字的筆劃非常複雜,在螢幕上縮得越小,越像一個黑點,也越難辨識了。解決這種小字顯示問題的技術,就要靠hinting技術了,其實就宛如踩地雷般,要一格一格來看。
螢幕字型特性:有玩過踩地雷嗎?
常常有人問,螢幕字型到底和印刷哪裡不同呢?其實載體特性的不同影響最大,例如在螢幕的字型顯示中,是以pixel為最小單位來顯示的,印刷出版則完全沒有這種特徵。
之前justfont在介紹信黑體W3時有約略介紹Bitmap點陣字的概念,所謂「點」就是pixel 。最早之前的電腦字型,其實並沒有向量的概念,也沒有圖形介面可使用。在那個時代,人們使用的字型是在固定的大小例如20*20的格子中,由人來「點」出字型的,現在看起來,這份工作非常像是踩地雷遊戲。
上面這個「配合」就是用點來構成字型顯示的。但現在連視網膜螢幕都出現了,像素密度高到看起來跟印刷品差不多。如果面對這麼精細的螢幕,還要把10*10到1000*1000的大小的點陣字都做出來,那就算把全世界的中文字體設計師都叫來工作,也是做不完的。
但還好現在的字型格式,像是truetype或opentype,都已經是可縮放的向量字型了,也就是只要一套字,就可以從 10*10 一直放大到1000*1000 (1000*1000通常是字型設計的原始大小,當然可以再放大)。
然而事情真的有這樣美好嗎?
因為pixel就是一格一格,它的顯示特性,以truetype格式在小字時的顯示當例子,就會像下面展示的那樣:
真的糗大了,這還像個仁嗎?有沒有發現,即使是向量字型,但在螢幕顯示時,描繪的方式仍然跟Bitmap描繪的命運相同,被像素切成一塊塊的。這在我們把字切得非常小的時候,更看得出來。例如圖示範例的12*12 (認真的算一算只有11*11,別懷疑,Bitmap也要留一格空白,不然字都黏一起了,這是bitmap的kerning拉!)。
用向量畫出的字,在小字時的橫線和直線都會斷掉,這是問題在書法字體例如楷書上最為嚴重,因為楷書的筆畫常有「腰線」,是要特別處理的圓滑,可惜被像素的方格硬生生斷開了,導致字型描繪時常出現斷筆的狀況。
其實拉丁字也有這個問題。為了不要讓字糊成一團,工程師就開發了hinting技術,也就是讓電腦依照規則,來解決小字顯示的問題。 hinting的小字處理困難在哪裡? 我們來看看最極端的例子:三條龍(念成:ㄊㄚˋ)如何塞進小框框裡?
這是truetype向量字型在16*16的點陣中處理的狀況, 所有筆畫幾乎都填滿空格,根本無法辨識這個字型。
你以為你看到的是那個字嗎?
事實上,把中文字縮小到一定的程度,就不能用原本的寫法了。例如上面非常極端的三個龍例子,在小size的bitmap顯示中,都做了「減筆」處理,下圖是細明體中的六套Bitmap「龘」字型:
如果家裡有放大鏡,可以拿來看一下。在這種大小時,「鑫」上面的「金」看起來比較像花卉的「卉」的寫法,但我們還是會覺得那是鑫。這種欺騙眼睛的技巧就叫做「減筆」。其實也是簡單的概念:同樣的方格,縮放到不同的大小,總沒有辦法裝一樣多的東西。如果想裝一樣多,那最後的結果就是看不到。這就是為什麼縮到12px的鑫會需要「減筆」的原因。
Hinting技術真的這麼神嗎?
依據以上所講的部份,最理想的中文Hinting在小字處理上的技術,應該包括以下幾個處理原則:
- 豎筆和橫筆的斷筆處理 (就是楷書範例中,讓筆畫成為一直線,而不是斷掉的筆劃)
- 複雜字型的自動減筆技術 ( 16 * 16沒辦法塞進這麼多筆畫的,要如何簡化? )
- 筆畫與空隙的平衡 ( 判斷何處要填墨,何處要空白 )
目前hinting在歐文語系的判斷和處理上較佳,中文則非常困難,因為中文實在太多字了,這也是各廠商目前在技術上仍無法克服的困難點,所以現在大家看到的在小字處理上,還是使用愚公移山的方式,用人工一格一格點的Bitmap小字才有辦法在螢幕上看清楚。
當然,這也只是Hinting技術的一小部分說明,目前只討論到黑(1)與白(0)的布局,後來更有關灰階和sub-pixel、cleartype等優化技術出現,justfont就留待以後慢慢跟大家介紹囉!