10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-01

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

##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程度まで削減することができました。

10
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?