現在製作中のCMSで、新しいメニューを追加したときメニューボタンも画像で書き出せないかと考えました。
ウェブアプリを主に制作していると、あまりLinux上のフォントなどを意識しません。
SSHでアクセスして作業するので、フォントなんて関係ないからです。
自分が管理しているウェブサーバにいったいどれぐらいのフォントがインストールされているのか調べたことも有りませんでした。
convert -list typeというコマンドで一覧は表示してみましたが、どんなタイプフェイスを持ってるのか、それらを実際に画像化できるかもわかりません。
そこで、PHPとImageMagickを使ってサーバにインストールされているフォントをそれぞれのフォントで画像にし、表示してみました。
【準備するもの】
- CentOS5以上
- ImageMagick
- PECL imagick モジュール
【手順】
- convert -list typeコマンドでフォントリストの取り出し。(ImageMagickのバージョンが6.3.5-6以前は”type”ではなく”font”だった。)
- 文字を画像として書き出し。
- 背景に文字画像を貼り付け出力
$image = new Imagick(); $draw = new ImagickDraw(); //背景色を設定 $background = new ImagickPixel('gray90'); //フォントサイズ $fontsize = 18; //位置行の高さ $height = 22; //Y位置 $var_offset = 20; //実際に画像化可能なフォント数を格納 $draw_count; //フォントによって行の幅が違うので、一番大きい値をセット $max_width = 0; //文字色 $draw->setFillColor('black'); //文字サイズ $draw->setFontSize($fontsize); $IMGLIST = array(); // imagemagickで認識しているフォントリストの取得 // imagemagickのバージョンによっては'type'ではなく、'font'の場合もあるので注意 exec("convert -list type", $IFonts, $res); // ブランク行を削除。空の配列を削除するのにarray_filterは便利 $IFonts = array_filter($IFonts); // アルファベット順に並び替え。これも便利 sort($IFonts); //ここから文字を画像化していく foreach ($IFonts as $FONT) { $font = explode(' ', $FONT); //フォントリストには余計なヘッダも含まれているので、その場合は無視。 if ($font[0] == 'Path:' || $font[0] == 'Name' || strstr($font[0], '--------')) { continue; } //フォントをセット $draw->setFont($font[0]); //フォント情報を取り出し。返り値がNULLの場合はアウトライン化できるフォントファイルがない if (!$fm = $image->queryFontMetrics($draw, $font[0] . " なんとか日本語もOKかな?")) { continue; } //最も長い文字列の幅をpixel数で取り出し if ($max_width < $fm["textWidth"]) { $max_width = $fm["textWidth"]; } // テキスト画像の作成 $draw->annotation(5, $var_offset, $font[0] . " なんとか日本語もOKかな?"); $var_offset += $height; $draw_count++; } //背景画像の作成 $image->newImage($max_width, $draw_count * $height, $background); //画像形式の設定 $image->setImageFormat('png'); //文字を画像に書き込み $image->drawImage($draw); //ヘッダをつけて画像の出力 header('Content-type: image/png'); echo $image;
結果:
フォント名の後ろのOKと表示されているのは、「なんとか日本語もOKかな?」の日本語部分がぬけて、OKだけが残ってるからです。
ちなみにWindows上でも同様のことはできますが、フォントリストの取り出し部分が多少異なりますので、ここでは割愛します。
他にも、systemやexecを使って直接convertコマンドを操作する方法も有りますが、こっちの方が早いでした。
はっきり言ってこのプログラムはあんまり使い道はないですが、少なくとも自分が使ってるウェブサーバにどんなフォントが入ってるかは遠隔から簡単に調べられます。
余談ですが、Helveticaがデフォルトで使えるのが嬉しい。Windowsには無いのに。