Index > 文字をイメージとして生成したい(phpをコマンドラインで使う)
Wed, July 5, 2006

{update:2007-06-06}

文字をイメージとして生成したい(phpをコマンドラインで使う)

テキスト中心のウェブサイトをつくっているが、 やはり見出しの部分は素のテキストではきつい。 せめて画像として美しいフォントで出力したい。

普通ここで、フォトショップとかGIMPを使うのかもしれないが、 タイトル文字列を画像化したいだけなのに、わざわざ画像ソフトを 使いたくはない。 まあ一回だけ使うならなんの問題もないのだが、 後々、都合により見出しテキストを変更したり、前景色または背景色を変えたり、 フォントサイズを変更する、ということは起きる。 そのとき、 タイトル文字列画像を再作成するためだけに、 フォトショップやGIMPを起動して、ちまちま見出しタイトル画像のひとつづつ作成しなおし などやっていられない。そんな無駄なことは絶対に許されない。

ということで、文字列・色・サイズなどはテキストファイルに記述しておいて それからプログラム的にタイトル画像を生成する方法を探ってみた。

結局PHPで解決

真っ先に、Javaを考えたが、あいにく制作マシンはLinux(Vine3.2)だから、 Javaからテキストイメージを生成するには、事前にJavaVM自体のフォント設定をやっておく 必要がある。(こんなときは、システムにインストールしたフォントがそのまま Javaから使えるMacOSXがうらやましい) 今回は見出しフォントなので、フォント名を指定して描画するようにしたい。 しかし、Linux上のJavaではこのあたりの、設定はやったことがないので、 どのくらい面倒か見当がつかない。
いや、そもそも単にテキストを画像としてプログラムで生成して保存したいだけなのに、 JavaVMのフォント管理について調査...というのは面倒すぎる。

次にmonoを試してみた。
結論全然NG。 そもそもGraphicsオブジェクトを生成するのに、Formオブジェクトから生成せよ などという解説しか見当たらない。イメージを生成して描画して保存したいだけなのに、 なんでフォームを生成する必要があるのかぁ!といいたい。 たぶんこれはわたしがやり方知らないだけなのだろうが、googleで問い合わせても有効な 回答が見つからないので挫折。

そして、PHPならどうかと思って調べると結構いけそうだ。

PHPで処理

PHPで以下のようなコードを書く。

#!/usr/bin/php -q
<?php
$text="ここにタイトル文字列を入れる";
$filename="foo.png";

$fontpath="/usr/lib/X11/fonts/TrueType/sazanami-gothic.ttf";
$x=0;
$y=19;

$image=imagecreate(200,20);

$white=imagecolorallocate($image,0xEE,0xEE,0xEE);
$black=imagecolorallocate($image,0x00,0x33,0x66);

imagettftext($image,18,0,$x,$y,$black,$fontpath,$text);


imagepng($image,$filename);
imagedestroy($image);

?>

これを foo.php として保存。
コマンドラインからPHPを実行。

 $ php foo.php

みかちゃんフォントを使う

先ほどはさざなみフォントを指定したが、 今度は、みかちゃんフォントを使ってみる。 ダウンロード先は以下から。

mikachan, mikachan-P, mikachan-PB, mikachan-PSの四種類ありますが、 とりあえずテストなので、 mikachanfont-8.8.tar.bz2 をダウンロードして、 解凍出てきた mikachan.ttf を適当な場所(/path/to/mikachan.ttf とします)へ保存して、 先ほどの foo.php のフォントパスを変更。

 $fontpath="/path/to/mikachan.ttf";

これで処理してみました。

Vine3.2では、apt-get install OpenType-mikachan としてみかちゃんフォントをインストール 可能なのですが、OpenType形式で、(よくわかっていないのですが)うまくいかないようです。 phpでは、OpenTypeは処理できなくて、TrueTypeを使う必要があるようなのです。

まとめ

これでテキストファイルに基本パラメータ(テキスト・色・サイズなど)を指定しておいて、 プログラムからテキストイメージを生成できることがわかりました。
まだ、phpスクリプト内にそれら基本パラメータが埋め込まれていてスマートさに 欠けますが、これを元に手直ししていけば、理想の形に持っていけるのではないかと。 (アンチエリアスなどはどうやってかけるの?)

 Twitter
follow me on Twitter
 Categories