在使用PHP 的GD 庫進行圖片文字處理時,經常遇到文字大小與指定寬度不匹配的問題。尤其是當我們希望文字在圖片上完美適應某個寬度時,調整字體大小成為關鍵。而PHP 中的imagefontwidth()函數,配合字體編號,可以幫助我們動態計算文字寬度,從而自動調整字體大小,使得文字恰好填滿指定寬度。
本文將詳細介紹如何使用imagefontwidth()和字體編號實現自動調整文字大小的效果。
imagefontwidth(int $font)返回指定內置字體編號的單個字符寬度(單位為像素)。 GD 庫內置了5 種字體,編號為1 到5,字體大小依次增大。
字體編號 | 字體大小(像素) | 說明 |
---|---|---|
1 | 5x8 | 最小字體 |
2 | 6x12 | 較小字體 |
3 | 7x13 | 中等字體 |
4 | 8x15 | 較大字體 |
5 | 9x15 | 最大字體 |
通過字體編號,我們可以快速獲取字體寬度併計算整段文字的寬度。
假設有一段文字text和一個期望的最大寬度maxWidth ,我們希望文字寬度不超過maxWidth ,並且字體越大越好。
步驟如下:
從最大字體編號(5)開始向小遍歷。
用imagefontwidth()乘以文字長度,計算整段文字寬度。
如果寬度小於等於maxWidth ,選擇該字體大小。
如果都超出,則選擇最小字體。
下面是一個完整示例,演示如何自動選擇合適字體大小,並在圖片上繪製文字:
<?php
// 字符內容
$text = "自動調整字體大小示例";
// 期望最大寬度(單位:像素)
$maxWidth = 200;
// 嘗試字體編號從5到1
$font = 5;
for ($i = 5; $i >= 1; $i--) {
$textWidth = imagefontwidth($i) * strlen($text);
if ($textWidth <= $maxWidth) {
$font = $i;
break;
}
}
// 創建圖片,寬度為 $maxWidth,高度為字體高度
$fontHeight = imagefontheight($font);
$im = imagecreatetruecolor($maxWidth, $fontHeight + 10);
// 顏色分配
$bgColor = imagecolorallocate($im, 255, 255, 255); // 白色背景
$textColor = imagecolorallocate($im, 0, 0, 0); // 黑色文字
// 填充背景
imagefilledrectangle($im, 0, 0, $maxWidth, $fontHeight + 10, $bgColor);
// 計算文字起始X坐標,實現居中
$textWidth = imagefontwidth($font) * strlen($text);
$x = ($maxWidth - $textWidth) / 2;
$y = 5;
// 輸出文字
imagestring($im, $font, $x, $y, $text, $textColor);
// 輸出圖片
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
該方法利用GD 庫內置字體的固定寬度特性,快速計算文字寬度。
strlen()適用於英文和單字節字符,若含有中文等多字節字符,建議使用mb_strlen()並調整計算邏輯。
如果需要使用TTF 字體,可使用imagettfbbox()來獲取更精準的文字寬度。
這種方案簡單高效,適合快速需求場景。