必须先用gd库加载原图和水印图,再通过坐标定位合成,最后保存或输出;路径须用绝对路径(如__dir__拼接)、水印png需带透明通道,imagecopy()参数顺序不可错,保存前确认目录可写并及时imagedestroy释放内存。

要在PHP中给图片自动添加水印,必须先用GD库加载原图和水印图,再通过坐标定位把水印“画”上去,最后保存或输出结果;路径拼接错误会导致imagecreatefrompng等函数报错“failed to open stream”,整个流程立刻中断。
准备两张图片并确认GD扩展已启用
确保PHP已开启GD扩展:在命令行运行 php -m | grep gd,有输出即表示可用;若无输出,需编辑php.ini启用 extension=gd 并重启Web服务。
准备好原图(如 /var/www/images/photo.jpg)和水印图(如 /var/www/watermark.png),【水印图必须是PNG且带透明通道,否则覆盖区域会显白底】。
用绝对路径加载图片,避免相对路径陷阱
不要用 ./images/photo.jpg 或 images/photo.jpg 这类相对路径——脚本执行位置一变就失效。
统一用 __DIR__ 拼接:$src = imagecreatefromjpeg(__DIR__ . '/images/photo.jpg'); $watermark = imagecreatefrompng(__DIR__ . '/watermark.png');
如果路径里含中文或空格,【必须用 urlencode() 编码后再拼接,否则 imagecreatefromxxx 会静默失败】。
计算水印位置并合成图像
第一步:获取原图与水印图尺寸
$src_info = getimagesize($src_path); $wm_info = getimagesize($wm_path);
第二步:设定水印右下角偏移量(例如距右、下各20像素)
$x = $src_info[0] - $wm_info[0] - 20;
$y = $src_info[1] - $wm_info[1] - 20;
第三步:用 imagecopy() 把水印贴到原图上
imagecopy($src, $watermark, $x, $y, 0, 0, $wm_info[0], $wm_info[1]);
注意:imagecopy() 第5、6参数是水印图的源起点(通常为0,0),不是原图坐标;填错会导致水印只显示局部或空白。
保存合成后的图片
方法一:保存为新文件
imagejpeg($src, __DIR__ . '/output/photo_with_wm.jpg', 95);
方法二:直接输出到浏览器(调试用)
header('Content-Type: image/jpeg');
imagejpeg($src);
调用 imagejpeg() 前必须确保目标目录有写权限,否则函数返回 false 且不报错;【保存路径的父目录不存在时,PHP不会自动创建,会直接失败】。
释放内存防止OOM
imagedestroy($src);
imagedestroy($watermark);
这一步不能省——尤其批量处理时,每张图占用几MB内存,不销毁会迅速耗尽PHP内存限制。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











