画像処理

【PHP】ImageTTFText()で描画する文字列の幅と高さを取得する方法

更新日:2023/08/31

ImageTTFText()で描画される文字列の幅と高さ、およびベースラインの位置を取得する方法を紹介します。

 

文字列のサイズを取得する関数

GDで文字列の描画後のサイズ情報を取得するときは、imagettfbbox()を使用します。

imagettfbbox()の構文

imagettfbbox( フォントサイズ , 角度 , フォントへのパス , 文字列)

戻り値は配列で、次のように四隅の座標がセットされます。

位置配列番号内容
左下0X2
1y8
右下2X336
3y8
右上4X336
5y-34
左上6X2
7y-34

表中の例は文字列 'abc gjp あいうえお' をフォントサイズ30で取得した値です。

このデータから高さを計算するのですが、高さのイメージが下端が0で上方に向かってプラスなので少し混乱するかもしれません。

取得できる座標はGDの座標系と同じです。
つまり、縦方向(y)は下方向にプラスされます。
横方向(x)は、右がプラスです。

次のようなイメージになります。

座標系の縦方向(y)が下方向にプラスされる

よって、高さと幅は次のような計算で求められます。

高さ = [1] - [7]
幅 = [2] - [0]

表の値を計算すると、

高さ = 8 - (-34 ) = 42
幅 = 336 - 2 = 334

になります。

コードは、次のようになります。

$bdBox = imagettfbbox( 30 , 0 , $font , 'abc gjp あいうえお' );
$h = $bdBox[1] - $bdBox[7]; // 高さ
$h = $bdBox[2] - $bdBox[0]; // 幅

 

回転させた時の高さと幅

imagettfbbox()で角度を指定した時の幅と高さを求めてみます。

この関数で得られる座標は、角度0の時の各コーナーが回転によって移動した先の座標になります。

imagettfbboxで回転

そのため回転後の左上と右下の座標を抽出してから、幅と高さを計算します。

$bdBox = imagettfbbox( 30 , 200 , $font , 'abc gjp あいうえお' );

$left = min($bBox[0],$bBox[2],$bBox[4],$bBox[6]); // 左上x
$top = min($bBox[1],$bBox[3],$bBox[5],$bBox[7]); // 左上 y

$right = max($bBox[0],$bBox[2],$bBox[4],$bBox[6]); // 右下x
$bottom = max($bBox[1],$bBox[3],$bBox[5],$bBox[7]); // 右下y

$h = $right - $left; // 高さ
$w = $bottom - $top; // 幅

 

ベースラインまでの高さを取得する

ImageTTFText()での文字描画はベースラインの左端を位置指定します。
そのため、文字列の左上を基準として描画したいときは、ベースラインの左端の座標を計算する必要があります。

そこで、文字列の上からベースラインまでの距離(高さ)を取得してみます。

ベースラインは下端のような気がしますが、次のように文字の途中にあります。

abc gjpq あいうえお

※赤線がベースライン

通常はベースラインを0として、上方向がマイナス、下方向がプラスです。
下図は前項で紹介したものですが、これを見ると分かりやすいと思います。

座標系の縦方向(y)が下方向にプラスされる

imagettfbbox()で取得した配列のインデックス7の絶対値が、ベースラインまでの高さになっています。
つまり、左上の座標からベースラインの位置を割り出すことができます。

コードは次のようなイメージになります。

$font_size = 30; // フォトサイズ
$x = 100; // 左上基準 x
$y = 100; // 左上基準 y

$bdBox = imagettfbbox( $font_size , 0 , $font , 'abcde' );

$bx = $x - $bdBox[6]; // ベースライン左端 x
$by = $y - $bdBox[7]; // ベースライン左端 y

ImageTTFText( $image , $font_size , 0 , $bx , $by , $color , $font , $text );

更新日:2023/08/31

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。