ImageMagickとPHPでフォントリストを画像で書き出してみた

Facebooktwitter

現在製作中のCMSで、新しいメニューを追加したときメニューボタンも画像で書き出せないかと考えました。
ウェブアプリを主に制作していると、あまりLinux上のフォントなどを意識しません。
SSHでアクセスして作業するので、フォントなんて関係ないからです。
自分が管理しているウェブサーバにいったいどれぐらいのフォントがインストールされているのか調べたことも有りませんでした。
convert -list typeというコマンドで一覧は表示してみましたが、どんなタイプフェイスを持ってるのか、それらを実際に画像化できるかもわかりません。

そこで、PHPとImageMagickを使ってサーバにインストールされているフォントをそれぞれのフォントで画像にし、表示してみました。
【準備するもの】

  • CentOS5以上
  • ImageMagick
  • PECL imagick モジュール

【手順】

  1. convert -list typeコマンドでフォントリストの取り出し。(ImageMagickのバージョンが6.3.5-6以前は”type”ではなく”font”だった。)
  2. 文字を画像として書き出し。
  3. 背景に文字画像を貼り付け出力

 

$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には無いのに。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload the CAPTCHA.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください