[TOP]

はじめに

百人一首関連のアプリを作りたい時に避けて通れない問題が「かるたの札画像をどうやって用意するか」というのがあります.
このページではいかに少ない容量でそこそこ美しい札画像を実現するかについて解説します.
以下の解説は主にAndroidをターゲットにしていますが,iPhoneでも使えるノウハウだと思います.

各案の検討

妥協案1.スマホ内蔵のフォントで描く

現状Androidは縦書きに対応していないのですが,一文字ずつ描画すれば擬似的に縦書きは実現できるでしょう.
しかし,Androidに内蔵されているフォントは端末やOSバージョンによって異なるし,大抵はかるた画像を描く上ではあまり美しくないフォントなのでこれはやりたくありません.

妥協案2. PNG画像を100首分同梱する

拙作の [かぜそみそ] は百人一首の札画像を好きなフォントで作成できるソフトなのですが,そのソフトで生成されたPNG画像を100首分アプリに同梱するという手もあります.
しかし,アプリでの使用に適した画質となると一枚のPNG画像の容量は30KB程度は確保しておきたいのですが,それだと100首で3MBにもなります.
3MBというのは今どきのスマホ端末にとっては大した容量ではないのですが,実際にアプリ配布する上ではこの3MBというのは意外に大きいです.
アプリの容量が大きければ大きいほどインストールされる確率は低くなりますし,アンインストールされる確率も高くなります.
現状3MBというのはユーザに「ちょっと大きいかな?」と思われるぐらいの大きさなのです(※1).
またPNG画像はラスタ形式の画像なので拡大縮小するとぼやけてしまうという欠点もあります.

※1 インストールした後にネットワークから札画像をダウンロードさせるという手もありますが,ネットワーク権限が必要ですし,あまり根本的な解決にはなりません.

妥協案3. SVG画像を100首分同梱する

かぜそみそには印刷機能が付いているのでそれを使ってPDF出力し,さらに [Inkscape] などでSVG形式に変換するという手もあります(※2).
SVGはベクタ形式の画像なので拡大縮小には強いですし,かるた画像の場合は容量も小さくなります.
Androidには現状SVG画像を描画するAPIはないのですが, [svg-android] などのSVG描画ライブラリを使えば描くことは可能でしょう.このライブラリはjar形式で16KB程度なので容量の心配はなさそうです.
試しにかぜそみそで取り札のSVG画像を作ってみると,100枚分の容量が圧縮前で2.3MB,ZIP圧縮させると620KB程度になりました.まあまあです.
ただ,読み札も作ろうとするとさらにこの2倍以上の容量がかかりますし.どうせならもっと少ない容量で札を描けるように頑張りたいところです.

※2 以下のコマンドで1つのpdfをページことに分解し,それぞれをSVG形式に変換できます.
$ pdftk input.pdf burst output output_%02d.pdf compress
$ for i in output_*.pdf; do inkscape --without-gui --file=$i --export-plain-svg=${i%.pdf}.svg; done

採用案

という訳でここからが本題です.スマホ内蔵のフォントで描くとあまり美しい札を描けないのであればアプリの中に美しいフォントを同梱すれば良いのです.
Androidには android.graphics.Typeface というクラスが用意されているので,それを使えば配布したapkファイルに同梱しているTTFフォントを使った描画が可能です.
ただし,日本語TTFフォントは容量が大きく,大体3MBから10MBぐらいです.ZIPでの圧縮率も7割程度なのでちょっと大き過ぎます.
という訳なので容量削減のためにフォントの中から百人一首に使われていない不要な文字を取り除くという作業を行ないます.
[FontForge] にはPythonライブラリが同梱されていて,それを使えばPythonスクリプトでTTF形式などのフォントファイルを編集することが可能です.

FontForgeのインストール

Ubuntuだと apt-get install fontforge python-fontforge あたりで良さそうです.
Gentooだと USEフラグに python, cjk, unicode, truetype あたりを付けて emerge -av media-gfx/fontforge すれば大丈夫です.

百人一首に使われるフォントのみの切り出し

以下のPythonスクリプト(2.7用)は取り札だけでなく,読み札も作れるように作者名や漢字部分も切り出しています.
取り札だけでいい場合はkanji=""にしてhiraから拗音,濁音,半濁音を取り除くといいでしょう.
上記のスクリプトを使って実際にIPA明朝からかるた用フォントを作ってみると,切り出し前で7.7MBあったのが切り出し後には245KBになり,さらにZIP圧縮すると175KBになりました.
あとはこのフォントを使って縦書きを頑張って描画するだけです.

フォントのライセンスについて

以上は技術的な観点で最良と思える方法を「採用案」としたのですが,実はフォントのライセンス的にはそうでもありません.「フォントを画像の中に使用して公開するのは許可するが, フォントファイル自体の改変は禁止」というライセンスのフォントは多いのです.これは無料でも有料でも同じ傾向にあります.
この辺の話は以下のページを参考にすると良いでしょう