首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 計算文字繪製寬高:imagettfbbox() 函數完整應用指南

     編輯:PHP 相關知識

前言

使用 GD 库繪製文字前,需先計算文字邊界框以決定圖片尺寸、置中座標。imagettfbbox() 返回 8 個座標點,本文封裝 text_width()、text_height() 兩個實用函數。

imagettfbbox() 返回值解析

索引:  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);
?>

常見問題與解決

  • 字體檔案路徑:必須使用絕對路徑,相對路徑在 CLI/Web 不同工作目錄下會失效。
  • 角度參數:imagettfbbox($size, $angle, ...) 角度為度數,逆時針旋轉。計算旋轉後寬高需用相同角度。
  • 中文字體:需指定支援中文的 TTF(如 Microsoft JhengHei, Noto Sans TC),否則顯示方塊。
  • 基準線對齊:imagettftext() 的 y 座標為基準線,非文字頂部。置中計算需考慮 $box[3] - $box[5] (上緣到基準線距離)。

總結

imagettfbbox() 是 GD 文字繪製的關鍵輔助函數,封裝 textWidth/Height 可大幅簡化版面計算。注意字體路徑、角度、基準線三大細節即可精準控制文字排版。希望本文對您的 PHP 程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved