1

その場でいくつかのテキストの PNG 画像 (透明な背景) を生成しています。テキストは、English 111 Vivace BT (スクリプト) をフォントとして使用して、ユーザーが入力したものになります。

テキストの大きさに関係なく、画像は常に高さ 100 ピクセル、幅 200 ピクセルになります。テキストを水平方向の中央に配置し、できるだけ画像の上部に近づけて配置したいと考えています。

imagettfbbox() がバウンディング ボックスに対して間違ったポイントを返しているように見え、テキストが実際よりも高いと見なされ、したがって画像の上部のテキストの前に空白が表示されることを除いて、これはすべて正常に機能します。

添付の png の例を参照してください。問題を示すために赤いガイドラインをいくつか描きました。左側には、imagettfbbox() がテキストの高さと見なす高さ 38px のガイドラインが表示されます。右側は、テキスト自体に対して測定された線を示しており、高さはわずか 26 ピクセルです。

ボックスを取得するより正確な方法はありますか?または、ここで他の間違いを犯しましたか?

$text = "A";
$fontSize = 15;
$font = "e111viva-webfont.ttf";
$textColor = convertHexToRGB( "000000" );
$angle = 25;
$image = imagecreatetruecolor( 200,  100 );
$textDimensions = imagettfbbox($fontSize, $angle, $font, $text);
$textHeight = abs($textDimensions[7]);
$textWidth = abs($textDimensions[0]) + abs($textDimensions[2]); // lower left X + lower right X
$textLeft = (200 - $textWidth) / 2;
// center horizontally
$textX = $textDimensions[0] + (imagesx($image) / 2) - ($textDimensions[4] / 2) - 25;
$textY = $textDimensions[1] * 2;
imagesavealpha($image, true);
imagealphablending($image, true);
$transparentColor = imagecolorallocatealpha($image, 0, 0, 0, 127);
$fillResult = imagefill($image, 0, 0, $transparentColor);
$textColor = imagecolorallocate($image, $textColor["r"], $textColor["g"], $textColor["b"]);
$ttfTextResult = imagettftext($image, $fontSize, 0, $textLeft, $textHeight, $textColor, $font, $text);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);

画像の高さが正しくありません

4

1 に答える 1

0

問題が見つかりました。それは私の間違いでした。角度を0ではなく25に設定しました。そのため、PHPは、テキストが角度で書き込まれると考えました。これにより、対角線全体の高さ(および幅)がからではなく測定されます。上から下、左右に。

角度を0に修正するとすぐに、正常に機能しました。

于 2012-10-09T20:47:25.970 に答える