imagemagickをつかってAUの絵文字PNGファイルを作る

Auemoticons-1
ドコモの2階調レジスター風ビットマップ絵文字(実装の簡単さをとった結果だと思われる)と違って、AUの絵文字情報はベクトルデータとして定義されているようで、KDDI au: 技術情報 > 絵文字
からイラストレータのファイルとしてダウンロードすることができる。

今回はいつものように solaris10 for x86 の上でPNGに変換する。イラストレータのファイル形式である.AIは ImageMagickで読み込んでいろいろな形式に変換することができる。実は.AIの中身はテキストファイルで、もともとpostscriptファイルの派生フォーマットらしい。(参考:PostScript, EPS, PDF, AI … ahhhh, what’s the difference? — The PowerPoint FAQ)
ためしに .AI のファイルの拡張子を .PDF に変えて acronbat reader に読み込ませてみると、普通に表示することができた。これまでイラストレータのデータを渡されるたびに、読めない!と言ってほかの形式で送り直してもらっていたけれど、たいていはこの方法で読めそうな雰囲気。

以下本題。

パッケージのインストール

Freeware for Solaris から必要なパッケージをとってきてインストールする。
ちなみにredhatとかでフルインストールにしてるとこれらは全部入っているので楽です。

wget http://www.sunfreeware.com/ftp/pub/freeware/i386/5.10/imagemagick-6.3.0-sol10-x86-local.gz
wget http://www.sunfreeware.com/ftp/pub/freeware/i386/5.10/freetype-2.2.1-sol10-x86-local.gz
wget http://www.sunfreeware.com/ftp/pub/freeware/i386/5.10/ghostscript-8.54-sol10-x86-local.gz
gzip -d imagemagick-6.3.0-sol10-x86-local.gz
gzip -d freetype-2.2.1-sol10-x86-local.gz
gzip -d ghostscript-8.54-sol10-x86-local.gz
pkgadd -d imagemagick-6.3.0-sol10-x86-local
pkgadd -d freetype-2.2.1-sol10-x86-local
pkgadd -d ghostscript-8.54-sol10-x86-local

いつも直接gzをpkgaddできるはずだと思いつつ展開してpkgaddしてるのですが、できないんでしょうか。

アイコンデータのダウンロード

AUのサイトで利用規約に同意して、30MくらいのLZHで圧縮されたデータファイルをダウンロードする。なつかしのLZHは LHa for UNIX を使って展開する。

展開されたファイルは、おそらくSJISで日本語のファイル名がついていて扱いにくいため、perlでさくっと日本語の部分を落として 8bit clean な名前に変更し、さらにimagemagickのconvertコマンドでPNGに変換する。

#!/usr/bin/perl
foreach ( glob "*.ai" ) {
        my $new = $_;
        my($no, $ext) = /^(\d+).*(\.ai)$/ or next;
        my $filename = "$no$ext";
        rename $_, $filename;
        qx{ convert  -trim -density 45 -transparent-color white -background none -colorspace RGB $filename $no.png };
}

-density 45 は書き出される絵文字のサイズが16×16になるようにするために与えてある。大きな値を入れれば書き出される絵文字のサイズを大きくすることができる。
問題なのは、変換元の.AIファイルがさまざまなバージョンのイラストレータで作成されていて、変換後の余白の大きさが違っていたり、画像の配置されている左上からのオフセットがまちまちなことである。そのため、変換時にまず余白を切り捨てるために -trim オプションを追加している。このオプションをつけることで、余白のない絵のはいっている部分だけのPNGが生成される。
-transparent-color white-background none は、背景を透明にするためにつけているが、機能しなかった。

後処理

しかし -trim を使って絵文字の部分だけの画像を作ると今度は!のように縦横比が極端で16×16をめいいっぱい使わない絵文字の場合に16×16よりも小さくなってしまうため、今度は16×16になるように微調整を行う。

まず合成用に16×16のカラの画像を作成する。

convert -size 16x16 xc:none white.png

そしてこれを合成する。

for file in *.png
do
    mv $file $file.old
    composite -size 16x16 -gravity center $file.old white.png  $file.png
done

そうすると、はじめの .AI から .PNGに変換するところで透過情報が失われて背景部分が透明でなくて白くなっているものの、16×16のPNG絵文字ができあがる。

できあがったものを公開したいからこういうことをやってるのだけれど、利用規約に従うならばできなさそうだ。なのでダウンロードしたデータから簡単に絵文字アイコンを作る方法を模索している。imagemagick API web service なんかがあれば、比較的簡単にだれでも絵文字アイコンPNGを作れるようになるのだけれど。


About this entry