在用 PHP 创建图片水印时,我们常常希望文字能够精准地出现在图片的特定位置,比如右下角或中心位置。但由于字体的大小和每个字符宽度的不同,计算水印的位置往往变得麻烦。幸运的是,PHP 的 imagefontwidth() 函数为我们解决了这个问题,尤其在使用内置字体时,它能帮助我们精确计算文字宽度,从而实现文字的精确定位。
imagefontwidth() 是 PHP 的 GD 库函数之一,它用于返回指定字体编号中每个字符的像素宽度。它的语法如下:
int imagefontwidth(int $font);
这个函数仅适用于 GD 库内置的字体,如 1 到 5。如果你使用的是 imagettftext() 加载的 TTF 字体,请改用 imagettfbbox() 来计算尺寸。
在给图片加文字水印时,我们需要明确水印文字的 宽度 和 高度,从而确定其起始坐标。例如,如果你想让水印显示在右下角,需要知道水印文字的宽度,以便从图片右边减去它的宽度作为 X 坐标。
但很多人直接用字符串长度作为宽度参考,这是不准确的。每个字体的字符宽度可能不同,甚至同一个字体中,不同字符宽度也可能不同(尤其是等宽字体与变宽字体)。
来看一个具体的例子,我们要在一张图片的右下角添加一段文字:“版权所有 m66.net”。
<?php
// 加载图片
$image = imagecreatefromjpeg('background.jpg');
// 设置字体编号和文字
$font = 4; // 内置字体编号 1-5
$text = '版权所有 m66.net';
// 获取文字宽度和高度
$textWidth = imagefontwidth($font) * strlen($text);
$textHeight = imagefontheight($font);
// 获取图片尺寸
$imageWidth = imagesx($image);
$imageHeight = imagesy($image);
// 设置文字颜色(白色)
$textColor = imagecolorallocate($image, 255, 255, 255);
// 计算文字左上角坐标(右下角偏移10像素)
$x = $imageWidth - $textWidth - 10;
$y = $imageHeight - $textHeight - 10;
// 写入文字
imagestring($image, $font, $x, $y, $text, $textColor);
// 输出图像
header('Content-Type: image/jpeg');
imagejpeg($image);
// 销毁资源
imagedestroy($image);
?>
在这段代码中,imagefontwidth($font) 返回每个字符的宽度,strlen($text) 返回字符数,两者相乘即得到整段文字的像素宽度。再用图片宽度减去文字宽度和边距,我们就得到了精确的右下角坐标。
imagefontwidth() 是一个简单但非常有用的工具,它可以让你在处理使用 GD 内置字体的水印定位时更加精确。配合 imagefontheight(),你可以对任何一个位置(左上、右上、居中等)进行精准控制。对于需要更复杂文字渲染的情况,如使用自定义 TTF 字体,请考虑使用 imagettfbbox() 做更复杂的边界计算。
利用 imagefontwidth() 和 imagefontheight(),让我们给图片添加水印也变得精确而高效。