現在製作中の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には無いのに。
