在PHP 中處理圖像文字時,常常需要獲取文字的寬度以便於排版和定位。傳統上,很多開發者會使用imagefontwidth()函數來獲得內置字體的字符寬度。但由於imagefontwidth()只能處理內置字體(且尺寸固定),其精度和靈活性有限,尤其在使用TrueType 字體時無法滿足需求。
本文將介紹如何用imagettfbbox()函數替代imagefontwidth() ,實現更準確的文字寬度測量,特別適用於自由使用TTF 字體的場景。
imagefontwidth()函數只接受內置字體的大小(1 到5),返回指定字體中字符的寬度(以像素為單位)。但該函數無法測量任何字符串的整體寬度,也無法支持自定義字體大小和字體文件。
<?php
// 傳統用法,獲取內置字體大小為3時一個字符的寬度
$charWidth = imagefontwidth(3);
echo "字符寬度: $charWidth";
?>
這種方法無法準確得到任意字符串或自定義字體的寬度。
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
以下示例演示如何用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 . " 像素";
?>
假設我們需要在寬度為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);
?>
imagefontwidth()僅適合內置字體且功能簡單;
imagettfbbox()能準確獲取任意TTF 字體的文字邊界尺寸,測量文字寬度更精準;
使用imagettfbbox() ,可以實現更靈活的文字定位和排版需求,尤其適合自定義字體和復雜文本。
通過本文介紹的示例,你可以輕鬆將imagefontwidth()替換為imagettfbbox() ,提升圖像文字處理的準確性和靈活性。