PHP :: imagettfbbox()関数について - イメージ関数(image) -

imagettfbbox

TypeType フォントを使用したテキストの bounding box の生成

array imagettfbbox ( float size, float angle, string fontfile, string text )

この関数は TrueType テキストの bounding box をピクセル単位で計算して返します。

size
ピクセル単位のフォントの大きさ。

angle
測定する text の角度(度単位)。

fontfile
TrueType フォントファイルのファイル名(URL)。PHP が使用している GD ライブラリのバージョンによっては、'/' から始まり '.ttf' で終わるような ファイル名で探し、またライブラリによって定義されているフォントパスで 探そうと試みます。

text
測定する文字列。


imagettfbbox() は、テキストの bounding box を 作成するための 4 点を表現する 8 個の要素からなる配列を返します。

配列のキー値の意味
0左下角の X 座標
1左下角の Y 座標
2右下角の X 座標
3右下角の Y 座標
4右上角の X 座標
5右上角の Y 座標
6左上角の X 座標
7左上角の Y 座標

4 点の座標は、角度によらず text に関する 相対位置で表わされます。 つまり、”左上”はテキストを水平に見た場合の左上の角を意味します。


言葉では分かりづらいので、可視化してみました

図の見方

「斜線」の図は、ベースとなる画像のキャンバスと見立ててください。

0 1 2 3 4 .. X
1┌───┐
2│//////│
3│//////│
4│//////│
:└───┘
Y

座標は左上が(0,0)で、基点となります。
X座標は右方向が正、左方向が負。
Y座標は下方向が正、上方向が負。
「白抜き」の図は bounding box の矩形(長方形)と見立ててください。

┌───┐
│67  45│
│      │
│01  23│
└───┘

ペアの数字は配列のキーを表し、ペアの左側がX座標、右側がY座標に相当します。


以下に、imagettfbbox 関数で返却された配列の値と bounding box の割り当てを可視化します。

Array
(
    [0] => 0
    [1] => 4
    [2] => 4
    [3] => 4
    [4] => 4
    [5] => 0
    [6] => 0
    [7] => 0
)

  0 1 2 3 4 ....
  ┌───┬─── X
 1│67  45│////
 2│      │////
 3│01  23│////
 4├───┘////
 :│////////////
 :│////////////
  │
  Y
Array
(
    [0] => 2
    [1] => 6
    [2] => 6
    [3] => 6
    [4] => 6
    [5] => 2
    [6] => 2
    [7] => 2
)

  0 1 2 3 4 ....
  ┌──────── X
 1│//////////////
 2│//┌───┐//
 3│//│67  45│//
 4│//│      │//
 :│//│01  23│//
 :│//└───┘//
  │//////////////
  │
  Y
Array
(
    [0] => -1
    [1] => 3
    [2] => 3
    [3] => 3
    [4] => 3
    [5] => -1
    [6] => -1
    [7] => -1
)

 ┌───┐
 │┌──┼──── X
 ││    │//////
 ││    │//////
 └┼──┘//////
   │////////////
   │////////////
   │////////////
   │
   Y



フォントのベースラインについて

フォントの多くは和文と欧文が混在した場合に欧文の底辺がベースの基準ラインとなるのですが、それをベースラインと呼びます。
下図で示せば Y軸(緑の横線) がベースラインになります。
※. 赤枠は imagettfbbox()関数で取得した バウンディングボックス(bounding box) の座標(4点)を矩形になるように結んだ枠です。

imagettfbbox(フォントのベースラインについて)

図を見ても解るように、$pos[0] と $pos[2] の値は0ではありません。
感覚としては赤枠の bounding box の左下($pos[0]と$pos[1])の座標が(0, 0)になると思いがちですが、実際は図の通りです。
ピクセル単位で細かく位置指定したい時など、知らないとハマリます(私もハマリました…)