ThinkPHP 实现图片动态文字水印需借助 GD 库或 think-image 扩展,核心是控制字体、位置、透明度及适配尺寸;推荐使用 think-image(基于 Intervention Image),支持链式调用与中文 TTF 字体,配合动态坐标计算、缓存机制和异常处理确保稳定高效。

ThinkPHP 实现图片动态添加文字水印,核心在于利用 PHP 的 GD 库或 Imagick 扩展对图像进行实时处理。官方未内置水印功能,但可通过 think-image 扩展(基于 Intervention Image)或原生 GD 快速实现,关键在于控制字体、位置、透明度、旋转和适配不同图片尺寸。
使用 think-image 扩展(推荐)
该扩展封装了 Intervention Image,支持链式调用,兼容 GD 和 Imagick,适合 ThinkPHP 6/7。
- 安装:
composer require topthink/think-image - 基础用法:读取原图 → 添加文字水印 → 保存或输出
- 示例代码(TP6 控制器中):
$image = \think\Image::open('./uploads/photo.jpg');
$image->text('© MySite', './fonts/msyh.ttf', 24, '#ffffff', \think\Image::WATER_SOUTHEAST, 10)
->save('./uploads/photo_watermarked.jpg');其中:WATER_SOUTHEAST 表示右下角;10 是透明度(0–100,数值越小越透明);字体路径需为绝对路径且确保 Web 可读。
自定义位置与动态参数
避免固定写死坐标,可结合图片宽高动态计算水印位置,比如居中偏右下、留边 20px:
立即学习“PHP免费学习笔记(深入)”;
- 先获取图片尺寸:
$info = $image->info(); $width = $info['width']; $height = $info['height']; - 用
text()的第 5 个参数传入坐标数组:[ $width - 150, $height - 40 ](假设文字宽约 150px、高约 40px) - 支持 UTF-8 中文,但务必使用支持中文的 TTF 字体(如微软雅黑、思源黑体),否则显示方块
防批量覆盖与性能优化
频繁生成水印图会消耗资源,建议按需生成并缓存:
- 生成唯一水印文件名,如:
md5($original . $text . $size . $position) . '.jpg' - 检查缓存目录是否存在对应文件,存在则直接返回,否则生成并保存
- 对大图可先缩放再加水印,减少内存占用:
$image->thumb(800, 600, \think\Image::THUMB_SCALE)->text(...)
异常处理与字体 fallback
线上环境常因字体缺失或权限问题导致水印失败:
- 加 try-catch 捕获
Intervention\Image\Exception\NotReadableException等异常 - 设置默认字体 fallback:先尝试系统字体路径(
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf),再退回到内置字体 - 开发时开启 GD 支持检测:
extension_loaded('gd'),并确认imagettftext()可用
不复杂但容易忽略细节,重点是字体路径、编码、坐标计算和缓存策略。只要配置得当,文字水印就能稳定嵌入各类上传图片中。



















