当前位置: 首页> 最新文章列表> 自动缩放字体:结合 imagefontwidth() 和字体编号调节

自动缩放字体:结合 imagefontwidth() 和字体编号调节

M66 2025-05-31

在使用 PHP 的 GD 库进行图片文字处理时,经常遇到文字大小与指定宽度不匹配的问题。尤其是当我们希望文字在图片上完美适应某个宽度时,调整字体大小成为关键。而 PHP 中的 imagefontwidth() 函数,配合字体编号,可以帮助我们动态计算文字宽度,从而自动调整字体大小,使得文字恰好填满指定宽度。

本文将详细介绍如何使用 imagefontwidth() 和字体编号实现自动调整文字大小的效果。


1. 了解 imagefontwidth() 与字体编号

imagefontwidth(int $font) 返回指定内置字体编号的单个字符宽度(单位为像素)。GD 库内置了 5 种字体,编号为 1 到 5,字体大小依次增大。

字体编号字体大小(像素)说明
15x8最小字体
26x12较小字体
37x13中等字体
48x15较大字体
59x15最大字体

通过字体编号,我们可以快速获取字体宽度并计算整段文字的宽度。


2. 自动调整字体大小的核心思路

假设有一段文字 text 和一个期望的最大宽度 maxWidth,我们希望文字宽度不超过 maxWidth,并且字体越大越好。

步骤如下:

  1. 从最大字体编号(5)开始向小遍历。

  2. imagefontwidth() 乘以文字长度,计算整段文字宽度。

  3. 如果宽度小于等于 maxWidth,选择该字体大小。

  4. 如果都超出,则选择最小字体。


3. 代码示例

下面是一个完整示例,演示如何自动选择合适字体大小,并在图片上绘制文字:

<?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);
?>

4. 说明

  • 该方法利用 GD 库内置字体的固定宽度特性,快速计算文字宽度。

  • strlen() 适用于英文和单字节字符,若含有中文等多字节字符,建议使用 mb_strlen() 并调整计算逻辑。

  • 如果需要使用 TTF 字体,可使用 imagettfbbox() 来获取更精准的文字宽度。

  • 这种方案简单高效,适合快速需求场景。


5. 参考链接