當前位置: 首頁> 最新文章列表> 替代方案:如何用imagettfbbox() 替代imagefontwidth 函數以獲取更準確的文字寬度?

替代方案:如何用imagettfbbox() 替代imagefontwidth 函數以獲取更準確的文字寬度?

M66 2025-06-11

在PHP 中處理圖像文字時,常常需要獲取文字的寬度以便於排版和定位。傳統上,很多開發者會使用imagefontwidth()函數來獲得內置字體的字符寬度。但由於imagefontwidth()只能處理內置字體(且尺寸固定),其精度和靈活性有限,尤其在使用TrueType 字體時無法滿足需求。

本文將介紹如何用imagettfbbox()函數替代imagefontwidth() ,實現更準確的文字寬度測量,特別適用於自由使用TTF 字體的場景。


1. imagefontwidth()的局限性

imagefontwidth()函數只接受內置字體的大小(1 到5),返回指定字體中字符的寬度(以像素為單位)。但該函數無法測量任何字符串的整體寬度,也無法支持自定義字體大小和字體文件。

 <?php
// 傳統用法,獲取內置字體大小為3時一個字符的寬度
$charWidth = imagefontwidth(3);
echo "字符寬度: $charWidth";
?>

這種方法無法準確得到任意字符串或自定義字體的寬度。


2. 使用imagettfbbox()獲取更準確的文字寬度

imagettfbbox()是PHP 提供的用於TrueType 字體的函數,它返回一個數組,表示給定文字在圖像上的邊界框坐標。通過計算這些坐標,可以獲得文字的寬度和高度。

函數原型:

 array imagettfbbox(float $size, float $angle, string $fontfile, string $text)
  • $size :字體大小

  • $angle :角度(一般為0)

  • $fontfile :字體文件路徑(.ttf)

  • $text :需要測量的文字

返回值:

返回8 個整數組成的數組,表示文字邊界框的四個頂點:

 0 => lower left X
1 => lower left Y
2 => lower right X
3 => lower right Y
4 => upper right X
5 => upper right Y
6 => upper left X
7 => upper left Y

3. 計算文字寬度的示例代碼

以下示例演示如何用imagettfbbox()來替代imagefontwidth() ,實現準確測量文字寬度。

 <?php
// 字符內容
$text = "Hello, 世界!";

// 字體大小
$fontSize = 16;

// 角度
$angle = 0;

// 字體文件路徑(假設字體文件位於服務器)
$fontFile = 'm66.net/fonts/arial.ttf';

// 獲取文字邊界框數組
$bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);

// 計算寬度
// 右下角X - 左下角X
$textWidth = abs($bbox[2] - $bbox[0]);

echo "文字寬度為: " . $textWidth . " 像素";
?>

4. 結合文字寬度動態居中顯示示例

假設我們需要在寬度為300px 的畫布中居中繪製文字,可以先用imagettfbbox()獲取文字寬度,然後計算起點:

 <?php
// 創建畫布
$imgWidth = 300;
$imgHeight = 50;
$image = imagecreatetruecolor($imgWidth, $imgHeight);

// 顏色定義
$bgColor = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 0, 0, 0);

// 填充背景
imagefill($image, 0, 0, $bgColor);

// 文字與字體參數
$text = "Hello, 世界!";
$fontSize = 20;
$angle = 0;
$fontFile = 'm66.net/fonts/arial.ttf';

// 獲取文字寬度
$bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);
$textWidth = abs($bbox[2] - $bbox[0]);
$textHeight = abs($bbox[5] - $bbox[1]);

// 計算X軸起點,實現水平居中
$x = ($imgWidth - $textWidth) / 2;

// 計算Y軸起點,實現垂直居中(注意 imagettftext 以基線為基準)
$y = ($imgHeight + $textHeight) / 2;

// 繪製文字
imagettftext($image, $fontSize, $angle, $x, $y, $textColor, $fontFile, $text);

// 輸出圖片
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>

5. 小結

  • imagefontwidth()僅適合內置字體且功能簡單;

  • imagettfbbox()能準確獲取任意TTF 字體的文字邊界尺寸,測量文字寬度更精準;

  • 使用imagettfbbox() ,可以實現更靈活的文字定位和排版需求,尤其適合自定義字體和復雜文本。

通過本文介紹的示例,你可以輕鬆將imagefontwidth()替換為imagettfbbox() ,提升圖像文字處理的準確性和靈活性。