yii2处理竖拍照片需手动解析exif方向标签并物理旋转:先用exif_read_data()读取orientation值(仅1/3/6/8有效),再映射为正角度调用imagerotate(),最后用imagejpeg()/imagepng()重编码保存以清除旧exif。

当你用Yii2框架处理用户上传的手机照片时,经常发现竖拍的照片在网页上横着显示——这不是前端渲染问题,而是图片自带的EXIF方向标签未被识别和执行物理旋转。Yii2本身不自动解析或修正EXIF方向,必须手动介入元数据读取与图像重写流程。
获取并解析图片EXIF方向值
在Yii2控制器中处理上传文件前,先用PHP内置的exif_read_data()函数提取Orientation标签:
使用exif_read_data($filePath, 'IFD0')读取基础EXIF信息,重点检查Orientation字段是否存在。若返回false或该键不存在,说明图片无EXIF或已被裁剪清除——此时不能依赖元数据,需跳过旋转逻辑或启用备用AI判断模块。
【Orientation值必须为1/3/6/8才有效】 其他值(如2、4、5、7)表示镜像翻转组合,在Yii2默认图像处理中无法直接映射,强行按数值旋转会导致内容左右颠倒。
根据方向值构造旋转角度
将EXIF方向值映射为GD库可执行的旋转角度:
方向值为6 → 顺时针旋转90°;方向值为8 → 逆时针旋转90°(等效于顺时针270°);方向值为3 → 旋转180°;方向值为1 → 不旋转。
注意:不要用imagerotate()直接传入负角度,PHP GD对负角度支持不稳定。统一换算为正角度(-90°→270°),再调用imagerotate($src, $angle, 0)。
执行物理旋转并保存新图
第一步:用imagecreatefromjpeg()或imagecreatefrompng()加载原始图像资源;
第二步:调用imagerotate()生成旋转后资源;
第三步:【必须调用imagejpeg()或imagepng()重新编码输出,否则EXIF方向残留】 原始文件即使旋转成功,若只改内存资源而不重写二进制流,浏览器仍会读取旧EXIF并再次错误旋转。
第四步:用file_put_contents()覆盖原图或存为新路径,完成物理校正。
移除旧EXIF防止二次干扰
方法一:使用piexif库剥离Orientation标签后再保存
方法二:在GD旋转后,用imagejpeg($rotated, $path, 100)强制以质量100重编码——这会丢弃所有原始EXIF,仅保留像素数据,是最轻量可靠的清空方式。
方法三:若需保留其他EXIF(如拍摄时间、GPS),则必须用piexif精确删除0th目录下的Orientation项,其他字段保持不变。











