ThinkPHP 的 water() 不支持文字旋转,因其实质是图片贴图;需用 text() 结合 imagettftext() 或 ImagickDraw 手动实现,并通过 imagettfbbox() 计算包围盒校准坐标。

ThinkPHP 本身不提供水印文字旋转的内置方法,think\Image 类只支持固定角度(90/180/270)的整图旋转,不支持在绘制文字时指定任意角度。真要实现「动态水印文字旋转」,必须绕过 water(),改用 text() + 手动计算坐标 + GD 或 Imagick 底层操作。
为什么 image->water() 不能设文字旋转角度
water() 方法仅接受图片路径或 think\Image 实例作为水印源,内部调用的是 GD 的 imagecopy() 或 imagecopymerge(),本质是贴图——它压根不处理文字渲染逻辑。所谓“文字水印”,其实是 text() 单独绘制的,而 text() 的第 5 个参数(角度)在 ThinkPHP 5.1+ 中已被移除,官方弃用了 GD 的 imagettftext() 角度参数,原因是跨平台字体渲染一致性差、坐标偏移难控。
用 text() + imagettftext() 手动写旋转文字
必须脱离框架封装,直接操作 GD 资源句柄。核心思路:获取 $image->getImg() 返回的 GD resource,再用原生 imagettftext() 绘制带角度的文字。注意以下几点:
- ThinkPHP 6 默认使用
think\image\driver\Gd,确保getImg()返回的是合法 GD resource(不是 Imagick 对象) - 字体文件路径必须是绝对路径,
__DIR__ . '/font/simhei.ttf'这类写法更安全 - 角度单位是“度”,正数为逆时针,例如
30表示逆时针转 30° - 坐标的 x/y 是文字基线左下角位置,不是中心点;旋转后需手动算偏移,否则文字会跑出画布
示例代码片段:
$image = \think\Image::open('./src.jpg');
$gd = $image->getImg(); // 获取 GD resource
$color = imagecolorallocate($gd, 255, 255, 255);
$font = __DIR__ . '/font/simhei.ttf';
$x = 100;
$y = 100;
$angle = 25; // 动态传入的角度
imagettftext($gd, 24, $angle, $x, $y, $color, $font, '© 2024');
// 注意:此时 $image->save() 仍可正常工作,因为底层资源未变
避免文字被裁切的关键:预估边界 + 平移校正
GD 的 imagettfbbox() 可提前算出旋转后文字的包围盒,从而调整起始坐标,防止文字一半消失。这是最容易被跳过的一步,也是线上出现“只显示半行字”的主因。
- 调用
imagettfbbox(24, $angle, $font, 'text')得到 8 个坐标值(左上、右上、右下、左下) - 用这 8 点算出最小外接矩形宽高:
$w = max($box[2], $box[4]) - min($box[0], $box[6]) - 若想让文字“居中叠加”,真实绘图坐标应为:
$x += $w / 2,$y += $h / 2(再配合 baseline 偏移) - ThinkPHP 的
text()默认居中对齐不可靠,手算才是唯一稳解
Imagick 驱动下怎么搞旋转文字
如果项目已切换到 think\image\driver\Imagick,getImg() 返回的是 Imagick 实例,不能直接喂给 imagettftext()。此时必须用 ImagickDraw:
- 创建
$draw = new \ImagickDraw() - 设置字体:
$draw->setFont('/path/to/simhei.ttf') - 设置旋转:
$draw->setRotation($angle) - 设置文字位置(注意:Imagick 的 y 是从上往下,且原点在左上角)
- 最后
$imagick->annotateImage($draw, $x, $y, 0, '© 2024')
注意 setRotation() 影响的是后续所有绘制,记得用 $draw->push()/pop() 隔离作用域,否则可能污染其他绘图逻辑。
真正麻烦的从来不是“怎么转”,而是“转完字在哪”。角度可以随便设,但坐标一错,水印就失踪——尤其当背景图尺寸多变、水印位置要自适应时,bbox 计算和坐标平移必须每张图都重算,没法偷懒复用固定值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











