その場でいくつかのテキストの 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);