在使用 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() 来获取更精准的文字宽度。
这种方案简单高效,适合快速需求场景。