利用 GD 库的 imagerotate() 可輕松實現圖片任意角度旋轉。本文封裝通用函數,自動識別 JPEG/PNG/GIF 格式並保持高質量輸出。
<?php
/**
* 旋轉圖片指定角度
* @param string $filename 源文件路徑
* @param string $src 目標保存路徑
* @param float $degrees 旋轉角度(默認 90°)
* @return bool
*/
function flip($filename, $src, $degrees = 90) {
// 1. 獲取圖片信息
$data = @getimagesize($filename);
if ($data === false) return false;
// 2. 根據類型創建圖片資源
switch ($data[2]) {
case IMAGETYPE_GIF: $src_f = imagecreatefromgif($filename); break;
case IMAGETYPE_JPEG: $src_f = imagecreatefromjpeg($filename); break;
case IMAGETYPE_PNG: $src_f = imagecreatefrompng($filename); break;
default: return false;
}
if (!$src_f) return false;
// 3. 旋轉(背景色 0 = 黑色透明)
$rotate = @imagerotate($src_f, $degrees, 0);
if (!$rotate) {
imagedestroy($src_f);
return false;
}
// 4. 保存為 JPEG(質量 100)
$result = imagejpeg($rotate, $src, 100);
// 5. 清理資源
imagedestroy($rotate);
imagedestroy($src_f);
return $result;
}
?>
<?php
// 將 photo.jpg 順時針旋轉 90° 保存為 photo_rotated.jpg
flip('uploads/photo.jpg', 'uploads/photo_rotated.jpg', 90);
// 旋轉 180°
flip('uploads/photo.jpg', 'uploads/photo_180.jpg', 180);
// 旋轉 270°(等價於逆時針 90°)
flip('uploads/photo.jpg', 'uploads/photo_270.jpg', 270);
?>
IMAGETYPE_* 代替 1/2/3,可讀性強imagerotate($src, $deg, 0) 第三參數為旋轉後露出區域的填充色(RGB 整數),0 為黑色imagejpeg($im, $file, 100) 最後參數 0-100,建議 90-100 平衡體積/質量imagedestroy() 防止內存洩漏,長時間運行腳本必須imagesavealpha() + imagecolortransparent()function flip_png_transparent($src, $dst, $deg = 90) {
$im = imagecreatefrompng($src);
$rot = imagerotate($im, $deg, -1); // -1 保持透明
imagesavealpha($rot, true);
imagepng($rot, $dst, 9); // 壓縮級別 9
imagedestroy($im);
imagedestroy($rot);
}
GD 庫旋轉操作屬 CPU 密集型,大批量處理建議異步隊列或使用 ImageMagick (imagick 擴展) 性能更優。