使用 GD 库繪製文字前,需先計算文字邊界框以決定圖片尺寸、置中座標。imagettfbbox() 返回 8 個座標點,本文封裝 text_width()、text_height() 兩個實用函數。
索引: 0 1 2 3 4 5 6 7 座標: x0, y0, x1, y1, x2, y2, x3, y3 對應頂點(基準線原點 (0,0)): 0: 左下 1: 左上 2: 右上 3: 右下 4: 右下 5: 右上 6: 左上 7: 左下 (重複,方便計算)
<?php
define('FONT_SIZE', 14);
define('FONT_FILE', __DIR__ . '/fonts/arial.ttf'); // 需存在 TTF 檔案
function getTextBox(string $text, int $size = FONT_SIZE, string $font = FONT_FILE, float $angle = 0): array {
return imagettfbbox($size, $angle, $font, $text);
}
function textWidth(string $text, int $size = FONT_SIZE, string $font = FONT_FILE): int {
$box = getTextBox($text, $size, $font);
// 寬度 = max(x) - min(x)
$minX = min($box[0], $box[2], $box[4], $box[6]);
$maxX = max($box[0], $box[2], $box[4], $box[6]);
return (int)ceil($maxX - $minX);
}
function textHeight(string $text, int $size = FONT_SIZE, string $font = FONT_FILE): int {
$box = getTextBox($text, $size, $font);
// 高度 = max(y) - min(y)
$minY = min($box[1], $box[3], $box[5], $box[7]);
$maxY = max($box[1], $box[3], $box[5], $box[7]);
return (int)ceil($maxY - $minY);
}
// 使用範例
$text = "Hello PHP GD!";
echo "寬度: " . textWidth($text) . "px\n";
echo "高度: " . textHeight($text) . "px\n";
// 繪製置中文字範例
$imgW = textWidth($text) + 20;
$imgH = textHeight($text) + 20;
$im = imagecreatetruecolor($imgW, $imgH);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $white);
// 計算置中座標
$box = getTextBox($text);
$x = ($imgW - ($box[2] - $box[0])) / 2;
$y = ($imgH - ($box[3] - $box[5])) / 2;
imagettftext($im, FONT_SIZE, 0, $x, $y, $black, FONT_FILE, $text);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
imagettfbbox($size, $angle, ...) 角度為度數,逆時針旋轉。計算旋轉後寬高需用相同角度。imagettftext() 的 y 座標為基準線,非文字頂部。置中計算需考慮 $box[3] - $box[5] (上緣到基準線距離)。imagettfbbox() 是 GD 文字繪製的關鍵輔助函數,封裝 textWidth/Height 可大幅簡化版面計算。注意字體路徑、角度、基準線三大細節即可精準控制文字排版。希望本文對您的 PHP 程式設計有所幫助。