• 締切済み

PHP GDでテキストを含む最小の画像を作りたい

PHP GDでテキストを描画し、画像の幅・高さがそれを含む最小になるように したいのです。 まずimageftbboxでバウンディングボックスを取得し、そのサイズにすればいいかと思い 以下のコードを書いてみましたが、うまくいきません。 <?php $fontSize = 20; $angle = 0; $fontFile = './msgothic.ttc'; // MSゴシック for ($code = ord('A'); $code <= ord('Z'); $code++) { $text = chr($code); $bbox = imageftbbox($fontSize, $angle, $fontFile, $text); $w = $bbox[2] - $bbox[0]; $h = $bbox[3] - $bbox[7]; var_dump($bbox); echo "w = $w h = $h\n"; $im = imagecreatetruecolor($w, $h); $backcolor = imagecolorallocate($im, 0x00, 0x00, 0x00); $forecolor = imagecolorallocate($im, 0xff, 0xff, 0xff); imagefill($im, 0, 0, $backcolor); $x = 0; $y = -$bbox[7]; echo "x = $x y = $y\n"; imagefttext($im, $fontSize, $angle, $x, $y, $forecolor, $fontFile, $text); imagegif($im, $text .'.gif'); } この場合、Iの右半分が切れてしまいます。 $xを調整すればいいのかと思い、$x = $bbox[0]などとしてみましたが、 どうやっても必ずどれかの文字の一部が切れてしまいました。 これを正しく描画するにはどのようにすればいいでしょうか?

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

imageftbbox で取得されるピクセル位置の原点は、ベースポイント (その文字の左下の角に近い文字のベースライン点) と、マニュアルにありますが、これは等幅で描くときの基準点のようです。特に I は細いので、文字部分の開始点($bbox[0])は、+3などになります。他の太めの文字は、-1なので、4pixelも異なることになります。(20point の場合) 英文字は、はみ出たり細かったり差が激しいので、文字サイズちょっきりにするとかえって不揃いになります。 よって、x位置も、左端の $bbox[0] または、$bbox[6] から算出しないと。 $x = -$bbox[6]; $y = -$bbox[7]; せっかくvar_dump してても、$textも一緒に書き出さないと、どの文字がどんな位置に出力されてるか、数値だけみててもわかりにくいです。

paraspor
質問者

補足

$x = -$bbox[6]; $y = -$bbox[7]; こうすると余計はみ出てしまいました。 なお、質問本文にもあるように、$bbox[6](==$bbox[0])も-$bbox[6]もすでに試しましたがだめでした。

すると、全ての回答が全文表示されます。
回答No.1

http://php.net/manual/ja/function.imageftbbox.php リファレンスのサンプルコードを使ってもうまくいかないのですか?

paraspor
質問者

補足

「例1 imageftbbox() の例」のことでしょうか? これは300x150の画像の中央に文字列を配置する例で、 私が欲しいのはこの状態から文字列を左上に移動し、さらに画像サイズを 最小(「The PHP Documentation Group」なら188x15くらい)にした状態です。

すると、全ての回答が全文表示されます。

関連するQ&A