一次讓字體看起來更像手寫體的嘗試
其實我對這個實驗的結果並不是特別滿意,但我還是想分享一下,因為擺弄字體是件非常簡單和有趣的事情。而且有人問我怎麼做,我告訴她我會寫一篇博文來介紹一下 :smiley:
背景:原本的手寫體
先交代一些背景信息:我有一個我自己的手寫字體,我已經在我的電子雜誌中使用了好幾年了。我用一個叫 iFontMaker 的令人愉快的應用程序製作了它。他們在網站上自詡為「你可以在 5 分鐘內只用手指就能製作出你的手工字體」。根據我的經驗,「5 分鐘」的部分比較準確 —— 我可能花了更多的時間,比如 15 分鐘。我對「只用手指」的說法持懷疑態度 —— 我用的是 Apple Pencil,它的精確度要好得多。但是,使用該應用程序製作你的筆跡的 TTF 字體是非常容易的,如果你碰巧已經有了 Apple Pencil 和 iPad,我認為這是一個有趣的方式,我只花了 7.99 美元。
下面是我的字體的樣子。左邊的「CONNECT」文字是我的實際筆跡,右邊的段落是字體。其實有 2 種字體 —— 有一種是普通字體,一種是手寫的「等寬」字體。(其實實際並不是等寬,我還沒有想好如何在 iFontMaker 中製作一個實際的等寬字體)
目標:在字體上做更多的字元變化
在上面的截圖中,很明顯可以看出這是一種字體,而不是實際的筆跡。當你有兩個相同的字母相鄰時,就最容易看出來,比如「HTTP」。
所以我想,使用一些 OpenType 的功能,以某種方式為這個字體引入更多的變化,比如也許兩個 「T」 可以是不同的。不過我不知道該怎麼做!
來自 Tristan Hume 的主意:使用 OpenType!
然後我在 5 月份的 !!Con 2020 上(所有的演講錄音都在這裡!)看到了 Tristan Hume 的這個演講:關於使用 OpenType 通過特殊的字體將逗號插入到大的數字中。他的演講和博文都很棒,所以這裡有一堆鏈接 —— 下面現場演示也許是最快看到他的成果的方式。
- 一個現場演示: Numderline 測試
- 博客文章:將逗號插入到大的數字的各個位置:OpenType 冒險
- 談話:!!Con 2020 - 使用字體塑型,把逗號插入到大的數字的各個位置!
- GitHub 存儲庫: https://github.com/trishume/numderline/blob/master/patcher.py
基本思路:OpenType 允許你根據上下文替換字元
我一開始對 OpenType 到底是什麼非常困惑。目前我仍然不甚瞭然,但我知道到你可以編寫極其簡單的 OpenType 規則來改變字體的外觀,而且你甚至不需要真正了解字體。
下面是一個規則示例:
sub a' b by other_a;
這裡 sub a' b by other_a;
的意思是:如果一個 a
字形是在一個 b
之前,那麼替換 a
為字形 other_a
。
所以這意味著我可以讓 ab
和 ac
在字體中出現不同的字形。這並不像手寫體那樣隨機,但它確實引入了一點變化。
OpenType 參考文檔:真棒
我找到的最好的 OpenType 文檔是這個 OpenType™ 特性文件規範 資料。裡面有很多你可以做的很酷的事情的例子,比如用一個連字替換 「ffi」。
如何應用這些規則:fonttools
為字體添加新的 OpenType 規則是超容易的。有一個 Python 庫叫 fonttools
,這 5 行代碼會把放在 rules.fea
中的 OpenType 規則列表應用到字體文件 input.ttf
中。
from fontTools.ttLib import TTFont
from fontTools.feaLib.builder import addOpenTypeFeatures
ft_font = TTFont('input.ttf')
addOpenTypeFeatures(ft_font, 'rules.fea', tables=['GSUB'])
ft_font.save('output.ttf')
fontTools
還提供了幾個名為 ttx
和 fonttools
的命令行工具。ttx
可以將 TTF 字體轉換為 XML 文件,這對我很有用,因為我想重新命名我的字體中的一些字形,但我對字體一無所知。所以我只是將我的字體轉換為 XML 文件,使用 sed
重命名字形,然後再次使用 ttx
將 XML 文件轉換回 ttf
。
fonttools merge
可以讓我把我的 3 個手寫字體合併成 1 個,這樣我就在 1 個文件中得到了我需要的所有字形。
代碼
我把我的極潦草的代碼放在一個叫 font-mixer 的存儲庫里。它大概有 33 行代碼,我認為它不言自明。(都在 run.sh
和 combine.py
中)
結果
下面是舊字體和新字體的小樣。我不認為新字體的「感覺」更像手寫體 —— 有更多的變化,但還是比不上實際的手寫體文字(在下面)。
我覺得稍微有點不可思議,它明明還是一種字體,但它卻要假裝成不是字體:
而這是實際手寫的同樣的文字的樣本:
如果我在製作另外 2 種手寫字體的時候,把原來的字體混合在一起,再仔細一點,可能效果會更好。
添加 OpenType 規則這麼容易,真酷!
這裡最讓我欣喜的是,添加 OpenType 規則來改變字體的工作方式是如此的容易,比如你可以很容易地做出一個「the」單詞總是被「teh」代替的字體(讓錯別字一直留著!)。
不過我還是不知道如何做出更逼真的手寫字體:)。我現在還在用舊的那個字體(沒有額外的變化),我對它很滿意。
via: https://jvns.ca/blog/2020/08/08/handwritten-font/
作者:Julia Evans 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive