必要なグリフだけを残してフォントの容量を削減


日本語フォントは容量が大きいので、スマートフォンアプリやウェブアプリではあまり気軽に使用することができません。
そこで、一部の文字だけを抽出したフォントを作成して、容量を削減します。

FontForge

FontForgeはGUIでフォントを編集できるクロスプラットフォームのツールです。
当然、選択した文字(グリフ)を削除する機能もあります。しかし、さすがに手作業でやるのは面倒くさい。

そこで、FontForgeのスクリプト機能を使用します。
http://fontforge.org/ja/scripting.html
なんと!日本語化されたドキュメントがあります!

使用する文字の準備

まず、使用する文字を列挙したファイルを作成します。今回はused_letters.txtというファイル名でUTF-8にして保存しました。

さっそくFontForgeスクリプトを実行したいところですが、FontForgeスクリプトの機能は貧弱です。UTF-8のデコードができません。

そこで、簡単なスクリプトを書いてFontForgeスクリプト自身を生成します。

#conding: utf-8
$stdout = File.open("./select_used.pe", "w")

print "codepoints = "
p File.read("used_letters.txt", encoding:"utf-8").codepoints
print <<EOM
i = 0
len = SizeOf(codepoints)
while (i < len)
    SelectMore(codepoints[i], codepoints[i])
    ++i
endloop
EOM

以下のようなスクリプトが生成されます。

codepoints = [10, 9, 34, 75, 111, 114, 101, 97, 110, 3]
i = 0
len = SizeOf(codepoints)
while (i < len)
    SelectMore(codepoints[i], codepoints[i]) // グリフを追加選択
    ++i
endloop
SelectInvert() // 選択範囲を反転
Clear() // 選択中のグリフを削除

結果

私のプロジェクトでは、20MBあったフォントを120KB程度まで削減することができました。