PHP图片加水印:图形叠加与文字水印代码实现
本文介绍如何使用PHP的GD库实现图片水印功能,包括图形叠加和文字水印两种常见场景,提供可直接运行的代码及关键参数解析。
结果与目标
在网页开发中,为图片添加水印是保护版权的常用手段。本文将展示如何利用PHP内置的图像处理扩展(GD库)完成两项操作:
- 图形水印:将一个透明的Logo图片或标志叠加到原始图片上。
- 文字水印:在图片特定位置写入自定义文字内容。
准备条件
- 环境支持:服务器需开启PHP GD库扩展。可通过
phpinfo()查看是否有gd模块。 - 字体文件:若需添加中文或其他复杂字体的文字水印,需准备对应的
.ttf或.otf字体文件路径。 - 素材准备:准备好要处理的背景图片(JPG/PNG)以及作为水印的图片(建议透明背景的PNG)。
真实操作顺序
第1步:添加图形水印(Logo叠加)
目的:将水印图片按指定坐标和尺寸覆盖到背景图上。
关键逻辑:先下载/读取图片,创建图像资源,使用坐标映射复制图层,最后输出或保存。
以下是实现步骤的代码演示:
<?php
// 1. 设置图片路径(实际项目中建议使用本地文件路径而非远程URL,避免依赖file_get_contents打开HTTP Wrapper)
$bgPath = 'background.jpg'; // 背景大图
$watermarkPath = 'logo.png'; // 水印图片(建议PNG格式带透明度)
// 2. 创建图像资源
$backgroundImg = imagecreatefromstring(file_get_contents($bgPath));
$watermarkImg = imagecreatefromstring(file_get_contents($watermarkPath));
if ($backgroundImg === false || $watermarkImg === false) {
die('无法加载图片资源');
}
// 3. 获取水印尺寸
$wmWidth = imagesx($watermarkImg);
$wmHeight = imagesy($watermarkImg);
// 4. 定义水印位置(例如:距离右上角10像素)
$xPos = imagesx($backgroundImg) - $wmWidth - 10;
$yPos = imagesy($backgroundImg) - $wmHeight - 10;
// 5. 执行图像拷贝混合
// imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h)
imagecopy($backgroundImg, $watermarkImg, $xPos, $yPos, 0, 0, $wmWidth, $wmHeight);
// 6. 输出图片
header("Content-Type: image/jpeg");
imagejpeg($backgroundImg, null, 90); // 质量90%
imagedestroy($backgroundImg);
imagedestroy($watermarkImg);
?>
注意:imagecopy 会完全覆盖下方的像素。如果需要半透明效果,应使用 imagecopymerge 替代,其增加了一个 $percent 参数来控制透明度(0-100)。
第2步:添加文字水印(FTText)
目的:在图片上渲染TTF字体文字。
关键逻辑:分配颜色,计算坐标,调用 imagefttext 绘制,根据原图格式输出对应 MIME 类型。
<?php
// 1. 加载背景图
$imgPath = 'photo.jpg';
$image = imagecreatefromstring(file_get_contents($imgPath));
// 2. 设置文字属性
$fontFile = './arial.ttf'; // 确保字体文件存在且路径正确
$text = '© My Website';
$fontSize = 20;
$angle = 0;
$color = imagecolorallocate($image, 255, 255, 255); // 白色文字
// 阴影颜色(可选)
$shadowColor = imagecolorallocate($image, 0, 0, 0);
// 3. 设置坐标 (X, Y)。Y通常基于基线,可能需要微调以视觉居中
$x = 10;
$y = 50;
// 4. 绘制文字
// 如需更精确的位置控制,可使用 imagettfbbox() 预先计算文本边界框
imagefttext($image, $fontSize, $angle, $x, $y, $shadowColor, $fontFile, $text);
imagefttext($image, $fontSize, $angle, $x+1, $y-1, $color, $fontFile, $text);
// 5. 判断原图类型并输出
list($width, $height, $type) = getimagesize($imgPath);
switch ($type) {
case IMAGETYPE_JPEG:
header('Content-Type: image/jpeg');
imagejpeg($image, null, 90);
break;
case IMAGETYPE_PNG:
header('Content-Type: image/png');
imagepng($image);
break;
case IMAGETYPE_GIF:
header('Content-Type: image/gif');
imagegif($image);
break;
default:
// 默认处理
imagedestroy($image);
exit('不支持的图片类型');
}
// 6. 销毁资源
imagedestroy($image);
?>
完成判断
当浏览器访问上述脚本时,如果能看到包含叠加Logo或文字的修改后图片,且右键保存得到的文件已包含水印,则操作成功。
简要总结
PHP处理图片水印主要依赖GD库的两个核心函数:imagecopy(或 imagecopymerge)用于图片合成,imagefttext 用于矢量字体文字渲染。使用时需注意内存管理(及时 imagedestroy)和编码兼容性问题(尤其是中文环境下需确保字体文件支持GBK或UTF-8字符集)。
以上就是PHP图片加水印的详细内容,更多关于PHP图像处理的相关资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









