php水印实现
添加文字水印
使用 imagettftext 函数在图片上添加文字水印。需要确保服务器安装了 GD 库和 FreeType 支持。
$image = imagecreatefromjpeg('source.jpg');
$color = imagecolorallocate($image, 255, 255, 255);
$font = 'arial.ttf';
imagettftext($image, 20, 0, 10, 30, $color, $font, 'Watermark Text');
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
添加图片水印
通过 imagecopy 或 imagecopymerge 函数将水印图片叠加到原图上。
$source = imagecreatefromjpeg('source.jpg');
$watermark = imagecreatefrompng('watermark.png');
$margin_right = 10;
$margin_bottom = 10;
$sx = imagesx($watermark);
$sy = imagesy($watermark);
imagecopy(
$source,
$watermark,
imagesx($source) - $sx - $margin_right,
imagesy($source) - $sy - $margin_bottom,
0,
0,
$sx,
$sy
);
header('Content-Type: image/jpeg');
imagejpeg($source);
imagedestroy($source);
imagedestroy($watermark);
调整水印透明度
使用 imagecopymerge 函数可以控制水印的透明度,最后一个参数是透明度百分比(0-100)。
imagecopymerge(
$source,
$watermark,
imagesx($source) - $sx - $margin_right,
imagesy($source) - $sy - $margin_bottom,
0,
0,
$sx,
$sy,
50 // 50%透明度
);
批量处理多张图片
遍历目录中的图片文件,为每张图片添加水印。
$directory = 'images/';
$files = scandir($directory);
foreach ($files as $file) {
if (in_array(pathinfo($file, PATHINFO_EXTENSION), ['jpg', 'png'])) {
$sourcePath = $directory . $file;
$outputPath = $directory . 'watermarked_' . $file;
$source = imagecreatefromjpeg($sourcePath);
// 添加水印代码...
imagejpeg($source, $outputPath);
imagedestroy($source);
}
}
检查 GD 库支持
在实现水印功能前,需要确认服务器支持 GD 库。
if (!extension_loaded('gd') || !function_exists('gd_info')) {
die('GD library is not installed');
}
水印位置计算
根据需求动态计算水印位置,例如居中或平铺。
// 居中水印
$positionX = (imagesx($source) - $sx) / 2;
$positionY = (imagesy($source) - $sy) / 2;
// 平铺水印
for ($x = 0; $x < imagesx($source); $x += $sx + $margin) {
for ($y = 0; $y < imagesy($source); $y += $sy + $margin) {
imagecopymerge($source, $watermark, $x, $y, 0, 0, $sx, $sy, 30);
}
}






