摘要:文字是社會生活中溝通的重要媒介之一。針對當前字體的設(shè)計開發(fā)高度依賴于字體設(shè)計軟件的問題,本文詳細闡述了字體開發(fā)的流程及其依賴的相關(guān)原理和技術(shù),提出了一種相對獨立的文字字體設(shè)計方案。在設(shè)計字體時,利用貝塞爾曲線設(shè)計和修改字體輪廓和結(jié)構(gòu),并利用Unicode技術(shù)為每一個字符編碼,從而結(jié)合字體度量和相關(guān)信息生成自己的字體庫文件。在繪制和渲染字體的過程中,利用字體編碼索引得到其對應的輪廓信息,完成輪廓信息解析后,便能獲取所需的數(shù)據(jù)。通過這種方法,用戶能夠輕松便捷地設(shè)計出自己的字體庫,從而擺脫對字體設(shè)計軟件的依賴。
關(guān)鍵字:字體設(shè)計;貝塞爾曲線;Unicode編碼;文字渲染
一、引言
在經(jīng)濟與技術(shù)飛速發(fā)展的今天,文字因其簡潔高效的信息傳輸能力,在人與人、人與電子設(shè)備的信息溝通中都起到了無可替代的作用,是人們進行交流和信息傳遞的重要媒介。字體的不斷更新與發(fā)展對文字的視覺呈現(xiàn)效果具有重要意義,然而,當前新的字體設(shè)計與開發(fā)往往高度依賴于幾個專業(yè)的字體設(shè)計軟件,如Adobe Illustrator,Glyphs,F(xiàn)ontLab等,這限制了普通用戶設(shè)計自己的字體庫和自由創(chuàng)作的能力。為了解決這一問題,本文將詳細探討字體開發(fā)的流程、原理。
目前,最為常見的字體文件為TTF、OTF格式,這類文件格式中包含了字符的輪廓和相關(guān)設(shè)置信息。用這種格式保存的字體在Windows、Linux和Mac平臺均能使用,有良好的兼容性;同時,該格式的字體具有良好的縮放性,能夠在不影響清晰的前提下實現(xiàn)字體的無損放大或是縮??;此外,可嵌入版權(quán)信息的特性使其能夠有效保護設(shè)計者的知識產(chǎn)權(quán)。因此,用TTF或OTF格式保存字體數(shù)據(jù)是十分可靠的選擇。
二、字體設(shè)計流程
本文將詳細闡述如何制作一個屬于自己的文字字體庫,即如何設(shè)計制作一個包含不同文字輪廓數(shù)據(jù)的TTF/OTF文件,其關(guān)鍵步驟如下:
第一,字形的設(shè)計。字形設(shè)計的核心內(nèi)容,是對字體庫中每一個字符進行字形設(shè)計,即設(shè)計出每個字符的輪廓。人們在設(shè)計字形時通常會使用專業(yè)的字形設(shè)計軟件,如Glyphs、FontLab等,但本文采用一種基于貝塞爾曲線的、相對獨立的字形設(shè)計方式,通過繪制和調(diào)整貝塞爾曲線,準確描述每個字符的形狀和細節(jié),此方法將在下文詳細介紹。
第二,文字的編碼。在設(shè)計字形之前,需先確定所使用的字符集和字符編碼,例如ASCII字符集或Unicode編碼,這由所要設(shè)計的字符數(shù)量決定。然后,為每個字符在字體文件中分配一個唯一的字符編碼,使得設(shè)計者能夠根據(jù)該編碼快速索引至該字符的詳細數(shù)據(jù)。
第三,字體的生成與測試。完成字形設(shè)計和編碼后,將這些字體數(shù)據(jù)封裝為TTF或OTF格式的字體文件。生成字體文件的同時,配置相應的參數(shù),以獲取所需的字體文件。最后,對生成的字體庫進行全面的測試,以確保字符的形狀、大小、比例和各項配置正確,確保字符之間的間距和對齊符合預期,同時,也要檢查字形在不同環(huán)境和平臺上的渲染效果和質(zhì)量。
通過以上步驟,便可以制作出一個自己的文字字體庫。字體設(shè)計和字體庫制作需要花費大量的時間和精力,下面,筆者將詳細闡述字體庫設(shè)計的關(guān)鍵內(nèi)容。
三、字體庫中的數(shù)據(jù)信息
在字體庫中需要保存字符的詳細信息,以便用戶在字體庫中索引到該字符后,能夠得到繪制該字體所需的必要數(shù)據(jù)。其中主要包括:
(一)字形信息
TTF文件中保存的和字形有關(guān)的信息具體定義了字符的準確形狀和詳細結(jié)構(gòu),它們是由大量的輪廓數(shù)據(jù)和筆畫數(shù)據(jù)構(gòu)成,主要是由貝塞爾曲線進行描述。具體而言,每一個漢字都可以描述為一個筆畫序列組,而筆畫又是由若干條曲線段或直線段構(gòu)成的,在對字形的具體描述中,詳細記錄了每一個筆畫的起始點、結(jié)束點、連接方式和線寬等信息,通過這些數(shù)據(jù)便能夠準確地繪制和顯示對應的字符。
(二)編碼信息
每一個字符都需要一個唯一的編碼與之對應,從而在繪制文字時,能夠快速地索引到該文字的詳細信息。目前使用最廣泛的編碼方式是Unicode編碼,它是一個在世界范圍內(nèi)通用的標準編碼方式,為全世界幾乎所有的文字、字符都分配了編碼值,具有良好的兼容性和通用性。針對漢字的索引,每一個漢字都與一個唯一的漢字編碼相關(guān)聯(lián),利用該漢字編碼將漢字與其相對應的字符集相匹配,這通常由一個名為字形下標表的結(jié)構(gòu)完成。字體文件中的字符順序和字符的編碼順序并不一致,所以,需要有字形下標表在字體文件中建立從字符編碼到字形數(shù)據(jù)的映射關(guān)系。這種映射機制使得文字在不同的環(huán)境中都能被正確地解析和繪制。
(三)字體度量和設(shè)置信息
字體庫文件中需要確定字體的基本度量值,包括字符間距、字符寬度、字符高度和字體的基線數(shù)據(jù)等信息。漢字在文本中的布局和位置是由這些度量信息決定的,因此,在字體的繪制中同樣需要這些度量值來計算字符的間距和行列的間距等屬性。此外,設(shè)置字體信息主要包括設(shè)置字體的粗體、斜體和下劃線等字體樣式,還包括抗鋸齒、字體平滑度等渲染設(shè)置和描邊、陰影等特殊效果設(shè)置。
四、字體輪廓的設(shè)計方法
字體庫中的每一個字符都是由若干直線段和曲線段構(gòu)成。對于計算機繪圖而言,文字雖然是一種特殊的圖形,但其繪制在本質(zhì)上與長方形、三角形等幾何圖形的繪制無異。要完成字體庫的設(shè)計與制作,首先需要了解一個文字是如何被繪制出來的。先介紹直線段的繪制過程。首先,應確定直線段的起始點和結(jié)束點,根據(jù)直線的一般方程計算得到該直線的斜率和偏移量,便能夠得到該直線的表達式。其次,通過線性插值的方式在直線段的起始點和結(jié)束點插入若干個填充點,并為起始點、結(jié)束點和填充點填充對應的顏色,便能夠完成一個直線段的繪制。曲線段的繪制過程比直線段的繪制過程更復雜。除直線外,任意彎曲的曲形弧線都可稱之為曲線。要在計算機中繪制一段曲線,首先需要得到曲線精確的數(shù)學描述。在計算機圖形領(lǐng)域,最常見的曲線描述方式就是貝塞爾曲線。貝塞爾曲線是一種數(shù)學曲線,其本質(zhì)是利用數(shù)學表達式描述平滑的曲線和路徑,該曲線由所有滿足該表達式的二維坐標點組成[1]。一階貝塞爾曲線可表示直線,二階及以上的貝賽爾曲線可表示各種曲線。貝塞爾曲線的階數(shù)越高,其所描述的曲線就越精確,所表示的曲線越復雜,但同時會增加計算資源的消耗[2]。
對于普通文字的繪制,二階和三階貝塞爾曲線即可滿足需求。二階貝塞爾曲線可由式(1)表示為:
B(t)=(1-t)2 P0+2t (1-t)P1+t2P2" " " " " " " "(1)
其中,P0、P1和P2是控制點,分別表示曲線的起始點、控制點和終點。想要繪制目標曲線,可通過修改貝塞爾曲線的起始點、終點和控制點的參數(shù)輕松實現(xiàn)。貝塞爾曲線擁有一套獨特的路徑描述方法,由操作碼加坐標點的形式表現(xiàn),如“M 0 0”表示將當前繪圖的起始點更改至坐標點(0, 0)處;“L 10 0”表示將當前點用直線連接至坐標點(10, 0)處。
曲線的設(shè)計主要有兩種方式。第一種是通過在SVG文件中,通過文本輸入的方式,利用貝塞爾曲線的操作碼完成圖形的生成。例如,想要繪制“王”字,可以首先使用命令“M 0 0”將繪圖的起始點移動到坐標(0, 0)處,然后使用命令“L 10 0”將起始點(0,0)與終點(10, 0)以直線連接,并配置繪制顏色為黑色,設(shè)置繪制線寬為1,由此便能夠繪制出一條長度為10個單位的水平直線,完成王字第一橫的繪制;接下來,用指令“M 2 5”將當前繪制點移動至坐標點(2, 5)處,再使用指令“L 8 5”繪制出一條以坐標點(2, 5)為起始點、以坐標點(8, 5)為終止點的直線段,即為王字的第二橫;緊接著,使用指令“M 5 0”將當前繪制點移動至坐標點(5, 0)處,然后用指令“L 5 10”繪制出一條以(5, 0)為起點、以(5, 10)為終點的豎線,為“王”字中的豎筆。通過上述方法可完成對“王”字的繪制。用這種繪制方法繪制出的字體橫筆、豎筆粗細相同,沒有書法字體的頓挫感,也缺失了筆鋒和筆力,字體并不美觀。要繪制具有設(shè)計感的書法字體,需要了解數(shù)學意義上的直線段與計算機圖像中的線段的區(qū)別。在數(shù)學中,一條線段僅由兩個端點描述,并不存在直線段自身寬度的定義。但在計算機圖像中,存在諸如“繪制出一條長度為10個單位、寬度為2個單位的直線”的操作,這個圖形在本質(zhì)上并不是一條直線段,而是一個寬為2個單位、長為10個單位的矩形。但由于長寬的比例懸殊,在視覺上人們會認為它是一條直線段。對點的認識也是這樣。在數(shù)學中,點表示一個坐標點,沒有形狀和大小。而在書法字體中,點更像是水滴的形狀。對點的繪制可由一個尖角和一段圓弧拼接而成,并將這個幾何圖形內(nèi)部填充上顏色。因此,要繪制形狀優(yōu)美的字體,需要用貝塞爾曲線描述每一個筆畫的外輪廓,然后再在其內(nèi)部填充上顏色。這樣,就能夠準確地設(shè)計出每一個筆畫的起筆形狀、筆畫粗細和收筆形狀,使得字體擁有設(shè)計感。
第二種設(shè)計方法是在貝塞爾曲線的可視化界面上,通過用鼠標直接對每一個筆畫進行拖拽的方式完成設(shè)計和修改。如要繪制一撇,首先選擇貝塞爾曲線的類型階數(shù)、起始點和結(jié)束點。一個三階貝塞爾曲線存在兩個控制點,通過改變控制點的位置可改變曲線的彎曲程度,并能直觀地展現(xiàn)曲線形狀的變化。相較于編程式的字體設(shè)計方式,交互式的曲線設(shè)計更為直觀和方便。
五、字符的索引方法
完成所有文字的字形設(shè)計后,需要按照一定的規(guī)則將其存儲起來,目的在于當在繪制或是顯示具體的某一個字符時能快速地檢索出其字形數(shù)據(jù),因此,對文字的合理編碼顯得十分重要。英文字母及字符的數(shù)量大約在一百到兩百之間,最原始的ASCII(American Standard Code for Information Interchange)編碼方式即能滿足需求。ASCII是計算機中最早且十分完善的字符編碼解決方案,利用七位二進制數(shù)所能表示的范圍定義了最基本的128個字符,成為計算機之間信息交換的標準[3]。在英文字符的字體庫中,采用ASCII編碼即能夠滿足字體索引需求,但漢字總數(shù)量超過10萬,常用漢字數(shù)量大約在3000字左右,需要索引范圍更大的編碼方式對其進行索引。
20世紀80年代,為了兼容大量不同的字符集,收納包括漢字、阿拉伯字母在內(nèi)的數(shù)量巨大的字符和符號,以IBM公司為首,聯(lián)合數(shù)家主要公司和標準制定機構(gòu),共同建立了一個名為“Unicode”的國際標準。Unicode編碼的優(yōu)勢在于,一方面,它給每一個字符提供了唯一的編碼,且在不同的平臺上的編碼具有一致性;另一方面,Unicode編碼兼容了大量的字符編碼方案,收集了幾乎所有的字體數(shù)據(jù),并且具有良好的可擴展性,支持新字符和符號的添加。UTF-8是Unicode中最為常見、使用最為廣泛的編碼方式之一,它包含了ASCII字符編碼,是ASCII字符集的擴展集。以“U+”開頭,與4至6個十六進制數(shù)字組合而成的碼點,為每個字符提供唯一的標識符。UTF-8在編碼技術(shù)實現(xiàn)上采用了可變長度編碼的方式,即根據(jù)每一個字符的碼點靈活地選擇1字節(jié)至4字節(jié)的大小進行編碼操作,最大內(nèi)存的4字節(jié)保證了UTF-8編碼能夠為字符集中的所有字符編碼,而對于大部分常用文字而言,使用少量字節(jié)即可完成編碼,大大減少了對內(nèi)存空間的占用。
為了使設(shè)計的字體庫能夠共享和推廣,且在其他設(shè)備和環(huán)境下能夠正常使用,需要將設(shè)計者對漢字的編碼與Unicode中的編碼相統(tǒng)一。獲取漢字Unicode編碼的方式有很多,如可以訪問Unicode官方網(wǎng)站,在其編碼搜索欄對特定的漢字編碼進行搜索,也可以借助第三方庫,如Freetype庫獲取漢字的編碼。獲取字體字形數(shù)據(jù)的一般流程為,首先,通過字符數(shù)據(jù)判斷其所占的字節(jié)數(shù),判斷方法具體為:如果該字符首字節(jié)的最高位數(shù)值為0,則該字符是單字節(jié)的UTF-8編碼;如果該字符首字節(jié)的最高位數(shù)值為1,并且相鄰低字節(jié)的最高位數(shù)值同樣為1,則該字符是多個字節(jié)的UTF-8編碼;在多字節(jié)UTF-8編碼的數(shù)據(jù)中,最高字節(jié)中的連續(xù)高位數(shù)值為1的個數(shù)為字符編碼的字節(jié)數(shù);其后的字節(jié)最高位為“10”,以便和首字節(jié)的前綴區(qū)分。例如,單字節(jié)字符的UTF-8編碼形如“0xxxxxxx”,其中“x”代表二進制數(shù)據(jù)的編碼位;兩字節(jié)字符的UTF-8編碼形如“110xxxxx 10xxxxxx”;三字節(jié)字符的UTF-8編碼形如“1110xxxx 10xxxxxx 10xxxxxx”;四字節(jié)字符的UTF-8編碼形如“11110xxx 10xxxxxx 10xxxxxx 10xxxxxx”。在處理多個字符構(gòu)成的字符串數(shù)據(jù)時,清楚地知道每一個字符的字節(jié)數(shù)有助于合理地分配內(nèi)存空間,也能夠幫助設(shè)計者確定字符串的長度,以便在字符串操作中提供正確的邊界信息。因此,利用上述編碼規(guī)則準確地獲取字符字節(jié)數(shù)據(jù)十分重要。得到字符的編碼信息后,通過碼點索引到字體庫中對應的該字符的詳細數(shù)據(jù),如大小、間距和貝塞爾曲線描述的輪廓數(shù)據(jù)等,將這些信息解析后,利用第三方工具(如Openvg)將文字繪制出來,從而使得設(shè)計的字體能夠得以顯示。
六、結(jié)束語
綜上所述,本文提出了一種相對獨立的文字字體設(shè)計方案。通過利用貝塞爾曲線設(shè)計和修改字體的輪廓和結(jié)構(gòu),并使用Unicode為每個字符進行編碼,結(jié)合字體度量和相關(guān)信息生成個性化的字體庫文件。通過這種方法,用戶能夠輕松且靈活地設(shè)計自己的字體庫。這一方案將為字體設(shè)計的發(fā)展和個性化實現(xiàn)提供更多可能。
作者單位:顧多瑞 甘肅省無線電監(jiān)測站張掖監(jiān)測站
參考文獻
[1]張亞林,李曉松.改進AOA結(jié)合貝塞爾曲線平滑的機器人路徑規(guī)劃[J].計算機工程與設(shè)計, 2023 ,44(10): 3170-3178.
[2]趙衛(wèi)東,周大昌.基于A~*與三階貝塞爾曲線的融合改進路徑規(guī)劃算法[J].安徽工業(yè)大學學報(自然科學版), 2023, 40(03): 333-338.
[3]楊健.一種基于編碼轉(zhuǎn)換的超GBK字符集解決方案[J].長江信息通信,2022, 35(06): 209-211.