PHP使用Imagick生成手机拍摄图片缩略图出现90°旋转问题求解
问题原因与解决方案
你遇到的缩略图90°旋转问题确实是由图片EXIF中的Orientation(方向)元数据导致的。手机拍摄时会根据重力传感器记录当前拍摄角度并写入EXIF信息,但Imagick处理图片时默认不会根据该元数据自动校正画面朝向,因此生成缩略图时会保留原始像素的存储朝向,出现旋转异常。
修复后的完整代码
function generateThumbnail($imgk, $width, $height, $quality) { if (is_file($imgk)) { $imagick = new Imagick(realpath($imgk)); // 新增EXIF方向校正逻辑 $orientation = $imagick->getImageOrientation(); switch($orientation) { case Imagick::ORIENTATION_BOTTOMRIGHT: $imagick->rotateImage('#000', 180); break; case Imagick::ORIENTATION_RIGHTTOP: $imagick->rotateImage('#000', 90); break; case Imagick::ORIENTATION_LEFTBOTTOM: $imagick->rotateImage('#000', -90); break; } // 校正完成后重置方向标记,避免后续应用读取旧值重复旋转 $imagick->setImageOrientation(Imagick::ORIENTATION_TOPLEFT); $imagick->setImageFormat('jpeg'); $imagick->setImageCompression(Imagick::COMPRESSION_JPEG); $imagick->setImageCompressionQuality($quality); $imagick->thumbnailImage($width, $height, false, false); // 可选优化:原写法对含多个点的文件名兼容性差,替换为pathinfo更稳妥 $filename_no_ext = pathinfo($imgk, PATHINFO_FILENAME); if (file_put_contents($filename_no_ext . '_thumb' . '.jpg', $imagick) === false) { throw new Exception("Could not put contents."); } return true; } else { throw new Exception("No valid image provided with {$imgk}."); } }
注意事项
- 请确保你的PHP Imagick扩展已开启EXIF读取支持,绝大多数默认编译的版本都内置该能力,若执行时报错可检查phpinfo中Imagick的相关支持项。
- 代码中
rotateImage的第一个参数为旋转后空白区域的填充色,此处设置为黑色,你可根据需求替换为透明或其他指定颜色。
内容的提问来源于stack exchange,提问作者steguozzo
相关产品推荐
相关产品推荐

