PHP グラフィック処理 ~テキストを描画する~

PHP

前回は画像のサイズと色を指定して出力するだけでしたが、今回は作成した画像の中にテキストを描画する方法を紹介していきます。

テキストを描画する

テキストを描画するにはimagestring関数imagettftext関数のいずれかを使用します。

imagestring関数

imagestring(GDImage, font_id, x, y, text, color);

GDImageはimagecreate関数などの返り値を渡してください。

font_idには1〜5の数値を指定します。
数値が5に近づくほど描画するフォントサイズが大きくなります。
imageloadfont関数でユーザー定義のビットマップを読み込んで独自のfont_idを使えるようにする方法もあります。
バイナリ形式のデータなので読み込むコンピュータに依存してしまいます。

imagecreate関数などで作成した画像の左上を0として、文字を表示する位置をxとyに渡します。

textには表示する文字を渡します。
マルチバイトには対応していないので日本語を渡すと文字化けします。

colorはimagecolorallocate関数の返り値を渡します。
2回目以降のimagecolorallocate関数の呼び出しは変数に代入しておくと使いやすいです。

白色の画像の中に黒色のDEMOという文字を表示して出力してみます。

$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);

$textColor = imagecolorallocate($image, 0, 0, 0);

imagestring($image, 5, 50, 50, "DEMO", $textColor);

header("Content-Type: image/png");

imagepng($image);

このようになっていれば正解です。

imagettftext関数

imagettftext(GDImage, size, angle, x, y, color, path, text);

imagettftext関数はimagestring関数より細かい設定が可能です。
imagestring関数ではフォントサイズを1〜5で設定していましたが、imagettftext関数はピクセルで指定できます。
他にも表示する文字の角度を変えたり、使用するフォントを選べます。
日本語に対応しているフォントであれば日本語を表示することも可能です。
imagettftext関数はデフォルトでアンチエイリアス処理が施されているのが特徴的です。

スクリプトと同じディレクトリにあるDIN Bold.otfのフォントでテキストを縦に表示しようとすると以下のようなコードになります。

$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);

$textColor = imagecolorallocate($image, 0, 0, 0);

imagettftext($image, 20, 270, 50, 50, $textColor, "./DIN Bold.otf", "DEMO");

header("Content-Type: image/png");

imagepng($image);

imagettftext関数を使用するとWebフォントを使用できるのが強いですね。
このようになっていれば正常に動作しています。

テキストの大きさを取得する

フォントサイズではなく、テキストを表示する領域の大きさを取得するにはimagettfbbox関数を使用します。

imagettfbbox($size, $angle, $font, $text);

返り値は要素数が8の配列形式で返される。

キー内容
0左下のX座標
1左下のY座標
2右下のX座標
3右下のY座標
4右上のX座標
5右上のY座標
6左上のX座標
7左上のY座標

テキストの表示領域を計算するには、

  • 右下のX座標から左下のX座標を引いた絶対値
  • 右上のY座標から右下のY座標を引いた絶対値

で求められます。

まとめ

  • 画像にテキストを描画する方法としてimagestring関数imagettftext関数がある
  • imagestring関数は1〜5の間でフォントサイズを決定する
    imageloadfont関数でユーザー定義のフォントを読み込むことができるが、マシン依存してしまう
  • imagettftext関数はフォントサイズをピクセルで指定できる
    また、表示するテキストの角度を変えたり、サーバーにあるフォントを読み込んでテキストのフォントを変更することができる
  • テキストの表示領域サイズを求めるにはimagettfbox関数を使用する