PHP动态为图片添加文字水印的实现方法
在使用PHP进行Web开发时,有时需要动态地在图片上添加版权信息或宣传文字作为水印。本文将演示如何使用PHP内置的GD库扩展,编写一个脚本来接收图片路径和文字参数,自动识别图片格式并在指定位置渲染中文或英文文本。
实现原理与准备工作
该方案的核心在于PHP的图像处理函数集。主要涉及以下几个关键步骤:首先解析输入的图片文件以获取其尺寸和类型;接着创建一个新的画布并将原图复制上去;最后利用imagettftext函数在画布上绘制文字。为了确保脚本的稳定性,需要提前准备好TrueType字体文件(如.ttf格式),并确保Web服务器运行环境已启用GD扩展。
第1步:设置HTTP响应头
由于最终输出的是图像数据而非HTML,因此必须告诉浏览器当前内容的类型。header("Content-type: image/jpeg")声明了输出流为JPEG格式图片。虽然脚本处理多种格式,但统一以JPEG编码输出可以兼容大多数浏览器的展示需求。
第2步:初始化与图片读取
使用GetImageSize()函数快速获取图片的文件大小、类型等信息。根据返回的类型值(1代表GIF,2代表JPG,3代表PNG),分别调用对应的创建函数:imagecreatefromgif()、imagecreatefromjpeg()或imagecreatefrompng()。同时,获取原图的宽度和高度,用于后续创建新画布。
注意:旧版PHP中函数名为ImageCreateFromGIF等,建议在现代PHP版本中使用小写形式以保持规范,尽管PHP通常对函数名大小写不敏感。
第3步:创建画布与复制原图
使用imagecreatetruecolor($srcW, $srcH)创建一个与原图尺寸一致的真彩色新画布。随后,利用imagecopyresampled()将原图资源复制到新画布中。这一步确保了底图为原始照片,而所有文字操作都在这个新建的图层上进行,避免直接修改原文件。
第4步:配置字体与颜色
定义字体文件路径,例如$font = "2.ttf"。确保该字体文件存在于脚本运行的目录下,或者提供绝对路径。使用imagecolorallocate()分配文字颜色,默认参数为黑色(R=0, G=0, B=0)。如果需要白色或其他颜色,可在调用主函数时传入相应的RGB值。
第5步:文字自动换行与绘制
这是处理长文本的关键部分。脚本通过循环计算文本长度,将其分割成多行。算法估算每行的字符数$len和行高$lgg,然后在一个while循环中逐行截取文本并使用imagettftext()写入画布。imagettftext的参数包括字体大小、角度、X/Y坐标、颜色、字体文件和待绘制的字符串。Y坐标随行数增加而下移,从而实现垂直排列。
<?php
Header("Content-type: image/jpeg");
function makethumb($srcFile, $text, $size = 12, $R = 0, $G = 0, $B = 0) {
// 如果未提供文本,使用默认值
if (!$text) {
$text = 'welcome xs.net.ru xayle';
$size = 20;
$R = 255;
}
// 获取图片信息
$data = GetImageSize($srcFile, $info);
// 根据类型创建图像资源
switch ($data[2]) {
case 1: // GIF
$im = @ImageCreateFromGIF($srcFile);
break;
case 2: // JPG
$im = @imagecreatefromjpeg($srcFile);
break;
case 3: // PNG
$im = @ImageCreateFromPNG($srcFile);
break;
default:
return false;
}
$srcW = ImageSX($im);
$srcH = ImageSY($im);
// 创建新画布
$ni = imagecreatetruecolor($srcW, $srcH);
imagecopyresampled($ni, $im, 0, 0, 0, 0, $srcW, $srcH, $srcW, $srcH);
$font = "2.ttf";
$textcolor = imagecolorallocate($ni, $R, $G, $B);
$i = 0;
$txt = '';
$len = ceil((12 * 22) / $size);
$lgg = ceil(($size * 16) / 12) - 1;
// 循环绘制多行文字
while (strlen($txt) > 0 || !$i) {
$start = $len * $i;
$kk = ceil($size * 13 / 12);
$txt = substr($text, $start, $len);
$hei = $i * $lgg + $kk;
imagettftext($ni, $size, 0, 8, $hei, $textcolor, $font, $txt);
$i++;
}
// 输出JPEG图片到浏览器
ImageJpeg($ni);
}
// 执行函数,默认参数
if (!$size || $size < 1) $size = 12;
makethumb("face.jpg", $text, $size, $R, $G, $B);
?>
完成判断与注意事项
当访问该PHP脚本时,浏览器应直接显示一张带有文字的覆盖图。如果页面显示空白或报错,请检查以下事项:首先确认服务器PHP版本是否支持GD库,可通过phpinfo()查看;其次,确保2.ttf字体文件存在且可读;最后,检查图片路径face.jpg是否正确。此外,由于imagettftext对中文的支持依赖于字体文件内部的编码映射,若文字显示为方块,请尝试更换为中文字体文件或调整文本编码为UTF-8。
以上就是PHP动态给图片加文字水印的详细内容,更多关于PHP图像处理的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













