php实现图片水印
添加文字水印
使用 imagettftext 函数可以在图片上添加自定义文字水印。需要确保服务器安装了 GD 库和 FreeType 支持。
// 加载原始图片
$image = imagecreatefromjpeg('original.jpg');
$color = imagecolorallocate($image, 255, 255, 255); // 白色文字
$font = 'arial.ttf'; // 字体文件路径
imagettftext($image, 20, 0, 50, 50, $color, $font, 'Watermark Text');
// 输出图片
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
添加图片水印
通过 imagecopy 或 imagecopymerge 函数可以将另一张图片作为水印叠加到主图上。

// 主图和水印图
$mainImg = imagecreatefromjpeg('original.jpg');
$watermark = imagecreatefrompng('watermark.png');
// 获取水印尺寸
$wmWidth = imagesx($watermark);
$wmHeight = imagesy($watermark);
// 合并水印(最后参数控制透明度)
imagecopymerge(
$mainImg, $watermark,
imagesx($mainImg) - $wmWidth - 10, // X位置(右下角)
imagesy($mainImg) - $wmHeight - 10, // Y位置
0, 0, $wmWidth, $wmHeight, 50 // 50%透明度
);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($mainImg);
imagedestroy($mainImg);
imagedestroy($watermark);
透明文字水印
创建半透明文字水印需要先分配带透明度的颜色:

$image = imagecreatefromjpeg('original.jpg');
$color = imagecolorallocatealpha($image, 255, 255, 255, 60); // 60透明度
imagettftext($image, 30, 45, 100, 200, $color, 'arial.ttf', 'Confidential');
多行水印处理
使用 imagettfbbox 计算文本尺寸来实现自动换行:
$text = "Line 1\nLine 2";
$lines = explode("\n", $text);
$yPos = 50;
foreach ($lines as $line) {
$box = imagettfbbox(20, 0, 'arial.ttf', $line);
$textWidth = $box[2] - $box[0];
imagettftext($image, 20, 0, (imagesx($image) - $textWidth)/2, $yPos, $color, 'arial.ttf', $line);
$yPos += 30;
}
动态水印位置
根据图片尺寸自动计算水印位置:
$margin = 20;
$x = imagesx($image) - $textWidth - $margin; // 右侧
$y = imagesy($image) - $margin; // 底部
注意事项
- 字体文件需要放在可访问的路径
- JPEG输出会丢失透明度,PNG更适合透明水印
- 处理前检查
extension_loaded('gd') - 大图片处理可能需要调整内存限制
这些方法可以组合使用,例如同时添加文字和图片水印,或创建半透明的平铺水印效果。






