PHP根据Exif数据旋转图片失效,处理后Orientation信息丢失问题
问题修复方案
核心故障:旋转逻辑未触发的根因
你调用exif_read_data时传入了第三个参数true,会将返回的EXIF数据按信息段分组,Orientation字段实际存放在IFD0分组下,你直接读取$exif['Orientation']永远为空,所以旋转代码从未执行,调整判断逻辑即可:
// 原判断 // if(!empty($exif['Orientation'])) { // 修改为 if(!empty($exif['IFD0']['Orientation'])) { $orientation = $exif['IFD0']['Orientation']; switch($orientation) { case 8: $original_image = imagerotate($original_image, 90, 0); break; case 3: $original_image = imagerotate($original_image, 180, 0); break; case 6: $original_image = imagerotate($original_image, -90, 0); break; } }
其他可能的异常排查点
- 确认PHP已开启exif扩展:可以通过
phpinfo()函数搜索exif项确认扩展状态,未开启的话需要编辑php.ini配置文件,移除extension=exif前的注释后重启服务生效。 - 角度参数兼容:部分低版本GD库对负数角度的支持存在问题,可以将
-90替换为270避免兼容问题。
EXIF信息丢失说明
PHP的GD库在调用imagejpeg()生成新图片时,默认不会保留原图片的任何EXIF元数据,因此处理后的图片丢失Orientation字段属于正常行为:
- 如果不需要保留其他EXIF信息,该结果是合理的:你已经根据原始Orientation将图片旋转为正确方向,丢失该字段可以避免后续前端、其他图像处理工具二次识别Orientation导致重复旋转的问题。
- 如果需要保留完整EXIF,可在图片处理完成后,调用系统的
exiftool工具将原图片的EXIF信息批量写入新生成的图片即可。
内容的提问来源于stack exchange,提问作者Toral Harish
相关产品推荐
相关产品推荐

