はじめに
本稿は、PHPのGDライブラリを用いて文字列を描画するの続きとなっています。
前回書ききれなかった、文字列を斜めに描画する方法について説明します。
描画領域の座標系について
このサンプルコードは前回説明したものと同じになりますが、imagettfbbox()にテキストを回転させる角度を度数法で指定します。
$bounding_box = imagettfbbox(
$font_size,
$text_angle, //第2引数で角度を指定する
$font_file_name,
$text
//PHP8.0では引数にarray $options = []が追加されている
);
開始位置を指定して文字列を描画する
ここからが曲者になります。
まず、文字列を描画するコードは前回のものを踏襲します。
imagettftext(
$image, //あらかじめ生成した空のイメージ
$font_size,
$text_angle, //0°(水平)を基準として任意の角度に回転させることができる
$min_x * -1, //テキストの開始位置のX座標
$min_y * -1, //テキストの開始位置のY座標
$foreground_color, //文字色
$font_file_name, //.ttfファイルのパス
$text //描画する文字列
);
テキストの開始位置のX座標、Y座標が不思議な値になっているのが分かると思いますが、この理由を以下で説明します。
まず上記のコードで、角度0°、フォントサイズ32、フォントにNoto Serif JapaneseのNotoSerifJP-Regular.ttfを指定して描画し、各バウンディングボックスの座標を取得してみます。
青い文字列の4隅に書かれた黒い座標がバウンディングボックスの座標です。
X座標は左から右に大きくなり、Y座標は上から下に大きくなる、すなわち座標系で言うところの第4象限です。
これ自体はプログラミングでは珍しいことではないと思いますが、上端のY座標が負の値になっていて、第1象限にはみ出しています。
つまり、このケースでは正しく描画するためにはY座標を36ピクセルずらしてやる必要があるということです。
文字列を回転させた場合はさらにややこしくなります。
フォントの条件をそのままに文字列の角度を100°とした場合のバウンディングボックスの座標を取得してみます。
ほぼ第2象限に飛び出しているのが分かります。
これを正しい範囲に収めると、以下のような座標になります。
つまり、文字列を描画する範囲としては、(0, 0)~(115,449)となります。
この(115, 449)とは、もとの座標系でそれぞれX軸、Y軸の最小となっていた値にマイナスを乗じたものです。
また、imagettftext()の仕様上、描画の開始位置は見た目の左上ではなく、文字列の1文字目の左下を起点とします。
ここまでが、上記サンプルコードでX軸、Y軸の起点に一見奇妙な値が入っている理由になります。
サンプルについて
前回の記事でも紹介したGitHub上のサンプル( https://github.com/kk-outlaw/php_gd_string )ですが、スクリプトにGETパラメータで文字列の角度を与えることができます。
まずはビルトインサーバでスクリプトを立ち上げ…
>php -S localhost:8080 gd_string.php
angleパラメータで角度を指定してみます。
終わりに
GDライブラリで文字列を描画するサンプルは多く見つかったものの、文字列を回転させた場合の仕様についてはなかなか参考文献が見つからず、バウンディングボックスの数値と睨めっこしていて気づくことができました。
参考文献
PHP: imageftbbox - Manual https://www.php.net/manual/ja/function.imageftbbox.php
PHP: imageftbbox - Manual https://www.php.net/manual/ja/function.imageftbbox.php
phpのGDライブラリを試してみました! #PHP - Qiita https://qiita.com/laughool/items/8ccdb6d51dceea5fb593