php实现水印
添加水印的基本方法
使用 PHP 的 GD 库或 Imagick 扩展可以为图片添加水印。GD 库是 PHP 默认支持的图像处理库,而 Imagick 提供了更强大的功能。

使用 GD 库添加文字水印
// 加载原始图片
$image = imagecreatefromjpeg('original.jpg');
$watermarkText = 'Watermark';
$font = 'arial.ttf'; // 字体文件路径
$color = imagecolorallocatealpha($image, 255, 255, 255, 50); // 白色半透明
// 在图片右下角添加水印
imagettftext($image, 20, 0, imagesx($image) - 200, imagesy($image) - 20, $color, $font, $watermarkText);
// 输出图片
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
使用 GD 库添加图片水印
// 加载原始图片和水印图片
$image = imagecreatefromjpeg('original.jpg');
$watermark = imagecreatefrompng('watermark.png');
// 获取水印图片尺寸
$watermarkWidth = imagesx($watermark);
$watermarkHeight = imagesy($watermark);
// 将水印放置在右下角
imagecopy($image, $watermark, imagesx($image) - $watermarkWidth, imagesy($image) - $watermarkHeight, 0, 0, $watermarkWidth, $watermarkHeight);
// 输出图片
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
使用 Imagick 添加水印
// 创建 Imagick 对象
$image = new Imagick('original.jpg');
$watermark = new Imagick();
$watermark->newImage(200, 50, new ImagickPixel('transparent'));
// 创建水印文本
$draw = new ImagickDraw();
$draw->setFont('arial.ttf');
$draw->setFontSize(20);
$draw->setFillColor('white');
$watermark->annotateImage($draw, 10, 30, 0, 'Watermark');
// 设置水印透明度
$watermark->setImageOpacity(0.5);
// 合并水印
$image->compositeImage($watermark, Imagick::COMPOSITE_OVER, imagesx($image) - 210, imagesy($image) - 60);
// 输出图片
header('Content-Type: image/jpeg');
echo $image;
水印位置计算方法
水印位置可以通过图片尺寸和水印尺寸计算得出:
- 左上角:x = 10, y = 10
- 右上角:x = image_width - watermark_width - 10, y = 10
- 左下角:x = 10, y = image_height - watermark_height - 10
- 右下角:x = image_width - watermark_width - 10, y = image_height - watermark_height - 10
- 居中:x = (image_width - watermark_width) / 2, y = (image_height - watermark_height) / 2
批量添加水印
$directory = 'images/';
$files = glob($directory . '*.jpg');
foreach ($files as $file) {
$image = imagecreatefromjpeg($file);
$watermark = imagecreatefrompng('watermark.png');
// 添加水印逻辑
imagejpeg($image, 'watermarked_' . basename($file));
imagedestroy($image);
imagedestroy($watermark);
}
水印透明度设置
GD 库中可以使用 imagecolorallocatealpha() 设置透明度,第四个参数为透明度值(0-127,0为完全不透明)。Imagick 中使用 setImageOpacity() 方法,参数为 0-1 之间的浮点数。
注意事项
- 确保服务器安装了 GD 库或 Imagick 扩展
- 处理不同格式图片时使用对应的函数(如
imagecreatefrompng()、imagecreatefromgif()) - 注意文件权限问题,PHP 需要有写入权限
- 大图片处理时注意内存限制






