2026-10-30 11:25:00
PHP使用GD库实现图片水印的核心方法是通过加载原图与水印图、定位、叠加图层并保存,同时需注意透明度处理与防移除策略。 以下是具体实现步骤与技巧:
一、基础图片水印实现加载图片资源
根据图片类型选择对应函数:
imagecreatefromjpeg()(JPEG)、imagecreatefrompng()(PNG)、imagecreatefromgif()(GIF)。
示例:$src = imagecreatefromjpeg('original.jpg');$watermark = imagecreatefrompng('watermark.png');
获取尺寸与定位
使用imagesx()和imagesy()获取宽高,计算水印位置(如右下角):$src_w = imagesx($src); $src_h = imagesy($src);$watermark_w = imagesx($watermark); $watermark_h = imagesy($watermark);$dest_x = $src_w - $watermark_w - 10; // 距右10px$dest_y = $src_h - $watermark_h - 10; // 距底10px
叠加图层
使用imagecopy()直接叠加或imagecopyresampled()调整水印大小:imagecopy($src, $watermark, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h);
保存与释放资源
保存图片(如JPEG格式,质量80):imagejpeg($src, 'watermarked.jpg', 80);imagedestroy($src); imagedestroy($watermark);
启用Alpha混合模式:imagealphablending($src, true);
保留透明信息:imagesavealpha($src, true);
完整代码示例:$src = imagecreatefromjpeg('original.jpg');$watermark = imagecreatefrompng('watermark.png');// ...(尺寸获取与定位同上)imagealphablending($src, true);imagesavealpha($src, true);imagecopy($src, $watermark, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h);imagejpeg($src, 'watermarked.jpg', 80);
增加复杂度
使用扭曲、渐变、半透明效果,或结合多个小水印分散布局。
平铺水印
通过循环在图片上重复叠加水印,覆盖整个画面:$step = 100; // 水印间距for ($x = 0; $x < $src_w; $x += $step) { for ($y = 0; $y < $src_h; $y += $step) { imagecopy($src, $watermark, $x, $y, 0, 0, $watermark_w, $watermark_h); }}
动态参数
根据图片内容动态调整水印位置、透明度或角度(如随机旋转)。
加密嵌入
将水印信息加密后隐藏到图片像素中(需结合算法实现)。
防盗链技术
服务器端配置限制图片引用路径,防止未经授权的访问。
核心函数
使用imagettftext()添加文字,需指定字体文件(.ttf)、大小、颜色和位置:$text = 'My Watermark';$font = 'arial.ttf';$font_size = 20;$color = imagecolorallocate($src, 255, 255, 255); // 白色imagettftext($src, $font_size, 0, $dest_x, $dest_y, $color, $font, $text);
文字定位与透明度
估算文字宽度(粗略方法):$dest_x = $src_w - strlen($text) * $font_size / 2;
调整颜色值实现透明度(如RGBA格式需额外处理)。
完整代码示例:
$src = imagecreatefromjpeg('original.jpg');$src_w = imagesx($src); $src_h = imagesy($src);$font_size = 20;$color = imagecolorallocate($src, 255, 255, 255);$dest_x = $src_w - 200; // 距右200px$dest_y = $src_h - 20; // 距底20pximagettftext($src, $font_size, 0, $dest_x, $dest_y, $color, 'arial.ttf', 'My Watermark');imagejpeg($src, 'text_watermarked.jpg', 80);imagedestroy($src);通过以上方法,可灵活实现图片与文字水印,并兼顾视觉效果与安全性。