imagerotate()是PHP GD扩展提供的轻量图片旋转函数,支持JPEG/PNG/GIF,需注意角度方向、透明通道处理、内存释放及0度警告规避。

用 imagerotate() 旋转图片最直接
PHP 自带的 GD 扩展提供了 imagerotate() 函数,是处理 JPEG/PNG/GIF 图片旋转最常用、最轻量的方式。它不依赖外部命令或 Composer 包,只要 GD 开启就能用。
注意:该函数会自动补白(默认黑色),且返回的是新资源,原图资源不会被修改。
-
imagerotate()第二个参数是角度,正数表示逆时针旋转(比如90是逆时针转 90°,视觉上像向左倒);如需顺时针 90°,传-90 - 第三个参数是背景色,常用
0(全黑)、0xffffff(纯白)或imagecolorallocatealpha($img, 0, 0, 0, 127)(完全透明) - 旋转后图像尺寸会变,宽高互换,但函数已自动计算新画布大小,无需手动 resize
保存旋转后的 PNG 时记得保留透明通道
如果源图是带 Alpha 通道的 PNG,直接用 imagepng() 保存可能丢失透明度——常见现象是透明背景变成黑色或灰色。
- 必须在
imagerotate()前调用imagealphablending($rotated, false)和imagesavealpha($rotated, true) - 完整链路顺序不能错:先创建图像 → 关闭混合 → 旋转 → 启用 alpha 保存 → 输出
- 示例关键片段:
$img = imagecreatefrompng('input.png'); imagealphablending($img, false); imagesavealpha($img, true); $rotated = imagerotate($img, -90, 0); imagealphablending($rotated, false); imagesavealpha($rotated, true); imagepng($rotated, 'output.png');
遇到 Warning: imagerotate(): No rotation specified 怎么办
这个警告不是因为你没传角度,而是因为传了 0 或 360 的整数倍——GD 内部会跳过旋转并返回原图资源,但某些 PHP 版本(尤其是 8.0+)会在日志里报这个 warning。
立即学习“PHP免费学习笔记(深入)”;
- 解决方案:旋转前加判断,
if (abs($angle) % 360 !== 0) { $rotated = imagerotate(...); } - 别用浮点数角度(如
90.0),GD 只接受 int,否则可能触发类型警告 - 如果只是想统一处理流程,可用
imagecopyresampled()手动仿射变换,但没必要——绕过imagerotate()反而更易出错
大图旋转内存不足?优先调用 imagedestroy()
旋转一张 4000×3000 的 JPG,内存占用可能瞬间飙到 20MB 以上。PHP 默认内存限制(如 128M)在批量处理时容易崩。
- 每完成一次旋转,立刻
imagedestroy($img)和imagedestroy($rotated),尤其在循环中 - 避免把多个旋转结果存在数组里(如
$results[] = $rotated),资源未释放会累积泄漏 - 临时加大内存仅作兜底:
ini_set('memory_limit', '256M');,但治标不治本
imagedestroy() 或忘记 imagesavealpha(),结果就和预期差很远。











