ThinkPHP6.x利用think\Image类可直接添加文字和图片水印。文字水印支持字体、颜色、位置与透明度设置,需绝对路径字体;图片水印推荐PNG格式,支持缩放与透明叠加,常用于右下角Logo。

ThinkPHP6.x 中添加图片水印,核心是利用内置的 think\Image 类,支持动态叠加文字水印和图片水印,无需额外扩展,开箱即用。
文字水印:灵活控制字体、颜色、位置与透明度
文字水印适合添加版权信息、作者名或网站标识。关键参数包括字体文件路径、字号、颜色、角度、间距和透明度。
- 字体文件必须为绝对路径(如 public/font/simhei.ttf),不支持相对路径或 URL
- 颜色使用十六进制(如 #ffffff)或 RGB 数组(如 [255,255,255])
- 位置支持常量:Image::WATER_NORTH_WEST(左上)、Image::WATER_CENTER(居中)等,也可用数组指定坐标 [10, 10]
- 透明度范围 0–100,建议设为 60–80,兼顾可见性与原图清晰度
图片水印:支持 PNG 透明底,推荐用于 Logo 叠加
图片水印更适合品牌 Logo,尤其带 Alpha 通道的 PNG 图片可自然融合背景。
- 水印图需为本地真实路径,不支持远程 URL;若使用 public 目录下资源,路径形如 public/logo.png
- 支持缩放:通过 $water->thumb(120, 60, \think\Image::THUMB_SCALE) 预处理水印图尺寸
- 位置同文字水印,但更推荐用 Image::WATER_SOUTH_EAST(右下角),避免遮挡主体内容
- 透明度同样生效,PNG 图片自身透明区域 + 透明度叠加,效果更柔和
实战示例:上传后自动加水印并保存新图
常见于用户上传头像、文章配图等场景。以下代码片段可在控制器中直接调用:
立即学习“PHP免费学习笔记(深入)”;
$image = \think\Image::open($uploadPath);
// 添加文字水印(居中,白色,半透明)
$image->text('© 2024 MySite', public_path('font/simhei.ttf'), 24, '#ffffff', \think\Image::WATER_CENTER, 70);
// 添加图片水印(右下角,缩放至 100x40,透明度 80)
$logo = \think\Image::open(public_path('logo.png'));
$logo->thumb(100, 40, \think\Image::THUMB_SCALE);
$image->water($logo, \think\Image::WATER_SOUTH_EAST, 80);
// 保存为新文件(不覆盖原图)
$image->save($watermarkPath);
注意事项与优化建议
水印功能虽简单,但易踩坑,注意以下几点:
- 确保 PHP 启用 GD 或 Imagick 扩展,否则 think\Image 初始化失败
- 字体文件缺失或路径错误会导致文字水印静默失效,建议加 file_exists() 判断
- 大图处理耗内存,生产环境建议限制上传尺寸,或使用异步队列处理水印
- 敏感内容建议同时开启「禁止右键下载」+「禁用开发者工具查看图片地址」,但水印仍是第一道版权防线



















