在PHP中处理图片和文字,常用的GD库提供了丰富的函数,能够帮助我们动态生成图像。本文重点讲解如何利用imagefontwidth()和imagecopy()函数结合,实现文字贴图效果。所谓文字贴图,就是将文字“切割”成小块或者贴图,然后拼接到目标图片上,达到更灵活的文字表现形式。
imagefontwidth(int $font): int
返回内置字体字符宽度,$font为字体大小标识,取值1-5。此函数对确定文字宽度很有用,便于计算拼接位置。
imagecopy(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h): bool
将源图像中的一块区域复制到目标图像指定位置。可用于将单个字符或切割的文字部分复制粘贴。
准备好包含所需文字的源图片(通常文字写在一个小图里)。
根据字体宽度和字符数量,逐字符从源图截取文字块。
通过imagecopy()函数将字符块依次复制到目标图片的指定位置。
调整位置参数,实现连贯文字贴图效果。
<?php
// 创建目标图像(白底)
$dst_width = 300;
$dst_height = 50;
$dst_im = imagecreatetruecolor($dst_width, $dst_height);
$white = imagecolorallocate($dst_im, 255, 255, 255);
imagefill($dst_im, 0, 0, $white);
// 源图,假设是文字"HELLO"贴图,宽高分别是每字符宽度*字符数和字符高度
// 实际使用时需要准备好包含完整文字的图片资源
$src_im = imagecreatefrompng('http://m66.net/images/letters.png');
// 设置字体大小(内置字体,1-5)
$font = 5;
$char_width = imagefontwidth($font);
$char_height = imagefontheight($font);
// 要贴的文字
$text = "HELLO";
$len = strlen($text);
// 计算文字起始位置,使文字居中
$start_x = ($dst_width - $char_width * $len) / 2;
$start_y = ($dst_height - $char_height) / 2;
// 逐字符复制
for ($i = 0; $i < $len; $i++) {
$char = $text[$i];
// ASCII偏移,假设源图文字排列是从'A'开始连续排列的
$offset = ord($char) - ord('A');
$src_x = $offset * $char_width;
$src_y = 0;
// 复制单个字符到目标图
imagecopy(
$dst_im,
$src_im,
$start_x + $i * $char_width,
$start_y,
$src_x,
$src_y,
$char_width,
$char_height
);
}
// 输出图片
header('Content-Type: image/png');
imagepng($dst_im);
// 释放资源
imagedestroy($dst_im);
imagedestroy($src_im);
?>
本示例假设文字素材图(letters.png)是字母按顺序排列在一张横向排列的图片,宽度为单字符宽度乘以字符数,高度为字体高度。
imagefontwidth()和imagefontheight()帮助我们精确获得字符宽高,方便逐字复制。
如果文字内容复杂,也可以结合imagettftext()渲染字体后再做处理,或者用imagecopyresampled()实现缩放。
利用此方法,可以做出有趣的文字动画效果、字母碎片风格贴图,甚至制作自定义水印。