アプリ版:「スタンプのみでお礼する」機能のリリースについて

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]などとしてみましたが、
どうやっても必ずどれかの文字の一部が切れてしまいました。

これを正しく描画するにはどのようにすればいいでしょうか?

※添付画像が削除されました。

A 回答 (2件)

imageftbbox で取得されるピクセル位置の原点は、ベースポイント (その文字の左下の角に近い文字のベースライン点) と、マニュアルにありますが、これは等幅で描くときの基準点のようです。

特に I は細いので、文字部分の開始点($bbox[0])は、+3などになります。他の太めの文字は、-1なので、4pixelも異なることになります。(20point の場合)
英文字は、はみ出たり細かったり差が激しいので、文字サイズちょっきりにするとかえって不揃いになります。
よって、x位置も、左端の $bbox[0] または、$bbox[6] から算出しないと。
$x = -$bbox[6];
$y = -$bbox[7];
せっかくvar_dump してても、$textも一緒に書き出さないと、どの文字がどんな位置に出力されてるか、数値だけみててもわかりにくいです。

この回答への補足

$x = -$bbox[6];
$y = -$bbox[7];

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

補足日時:2011/08/18 15:27
    • good
    • 0

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

この回答への補足

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

補足日時:2011/08/11 09:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!