Yii2中为图片添加水印需先安装yii2-imagine并正确配置,再用Image::watermark()或Image::getImagine()->open()结合字体度量计算动态坐标,支持固定像素、百分比及平铺等精准定位方式。

在Yii2项目中为图片添加水印并精确控制其位置,是保护原创内容、标注版权信息或强化品牌露出的刚性需求。当上传用户头像、生成分享图、导出报表截图时,若水印始终偏移、缩放失真或覆盖关键区域,说明位置逻辑未适配不同尺寸图片——这会导致法律效力存疑、视觉体验受损。
使用Imagine扩展添加图片水印
第一步:确认已安装yii2-imagine及底层Imagine库,并完成vendor目录下的autoload和extensions.php配置。若未完成,【插件未注册会导致Image::watermark()方法根本不可用】。
第二步:在控制器中引入类:use yii\imagine\Image;。注意不要漏掉命名空间前缀yii\,否则会报Class not found。
第三步:调用静态方法添加水印:Image::watermark($sourcePath, $watermarkPath, [$x, $y])->save($targetPath);。其中$watermarkPath必须是PNG或带透明通道的图片,JPG水印会自带白底破坏效果。
文字水印的动态坐标计算
文字水印无法直接传入坐标数组,需借助GD或Imagine的字体度量能力手动算位置。以下以右下角15px边距为例:
① 先获取原图宽高:$size = getimagesize($sourcePath); $width = $size[0]; $height = $size[1];
② 加载字体文件并估算文字宽度(需提前准备.ttf字体):$font = \Imagine\Image\Font::fromFile('path/to/font.ttf', 24, ['r'=>0,'g'=>0,'b'=>0,'alpha'=>0.7]);
③ 计算右下角X坐标:$x = $width - $font->getWidth('©2026 Company') - 15;。这里减去的是文字像素宽度,不是字符数——不测宽直接写死坐标,水印会在不同分辨率图片上严重错位。
④ 计算Y坐标:$y = $height - 15;。注意GD系Y轴向下增长,Y值越小越靠上,此处取高度减边距即贴近底边。
⑤ 最终绘制:Image::getImagine()->open($sourcePath)->draw()->text('©2026 Company', $font, [$x, $y])->save($targetPath);
四角/居中/自适应位置的快捷写法
方法一:右下角固定边距(推荐用于LOGO水印)
直接传入坐标:[$width - 80, $height - 40]。80和40是预估的水印图宽高,适用于尺寸稳定的logo图。
方法二:居中铺满式文字水印(防截图盗用)
用循环+旋转实现平铺:for ($i = -100; $i draw()->text('CONFIDENTIAL', $font, [$i, $j])->rotate(-30); } }。旋转-30度能大幅降低可读性,但必须确保$font支持中文,否则显示方块。
方法三:按百分比定位(适配手机竖图与桌面横图)
X坐标设为$width * 0.92,Y坐标设为$height * 0.96。0.92表示距右边缘8%,0.96表示距底边缘4%,比固定像素更鲁棒。


















