exif方向信息藏在jpeg/tiff文件的orientation字段中,exif_read_data()返回含该整数(1–8)的数组,需用switch分支映射旋转操作,而非直接当css角度使用。

EXIF方向信息藏在哪,exif_read_data() 返回什么
PHP读取图片方向不靠猜,靠exif_read_data()返回的Orientation字段。这个值是整数(1–8),对应相机拍摄时的物理朝向,不是CSS旋转角度。常见错误是直接拿它当rotate()参数用——比如看到6就调imagerotate($img, 90, 0),结果翻转错乱。
实际映射关系必须查标准:6表示“顺时针旋转90°后正立”,意味着原图需要逆时针旋转270°(或顺时针90°)才能正常显示;3要转180°;8要转-90°(即270°)。更稳妥的做法是用switch分支处理,而不是算术推导。
-
exif_read_data()只对JPEG和TIFF有效,PNG、WebP默认无EXIF,返回false或空数组 - 需开启PHP的
exif扩展(php.ini中取消;extension=exif注释) - 部分服务器禁用
exif_read_data()(如某些共享主机),应加function_exists('exif_read_data')判断
自动校正前先确认图片是否真有方向问题
不是所有JPEG都带Orientation,也不是所有Orientation !== 1都需要旋转——有些编辑软件(如Photoshop“存储为Web所用格式”)会把方向写入EXIF但同时已将像素数据物理旋转,此时再转一次就翻车了。
安全做法是:只对Orientation为3、6、8的图片执行旋转,且旋转后必须重置Orientation为1,否则下次读取还会触发重复校正。
- 用
getimagesize($file, $info)配合$info['exif']也可读EXIF,但不如exif_read_data()稳定,尤其对大图 - 校正后保存JPEG时,用
imagejpeg($img, $path, 95),不要丢掉质量参数,否则压缩失真 - 若用
GD库旋转,注意imagerotate()会添加黑边,要用IMG_COLOR_TRANSPARENT+imagealphablending()处理透明背景(仅限支持alpha的格式)
用imagick替代GD避免旋转失真
GD的imagerotate()本质是仿射变换,小图看不出,但高分辨率人像边缘易出现锯齿和模糊。而Imagick的setImageOrientation() + autoOrient()是元数据级操作——不重采样像素,只是告诉渲染器“按这个方向显示”,速度更快、质量无损。
但要注意:autoOrient()会直接修改图像数据并清除原始EXIF,如果业务需要保留原始拍摄信息(如地理坐标),就得先用getImageProperties('exif:*')提取再写回。
-
Imagick需安装ImageMagick系统库及PHP扩展,比GD依赖重 -
autoOrient()只处理Orientation,不处理Rotation等其他旋转字段(极少用) - 调用后务必用
stripImage()清理冗余EXIF,否则文件体积可能暴涨
WebP和HEIC格式的EXIF兼容性陷阱
PHP原生exif_read_data()对WebP完全无效——WebP的EXIF存于VP8X chunk或XMP metadata,GD和Imagick 3.4.4+才开始有限支持。HEIC(iPhone默认)更麻烦,PHP至今无内置解析能力,必须依赖libheif或外部命令行工具(如exiftool)。
真实场景中,用户上传的所谓“JPG”可能是手机相册导出的HEIC转JPEG(带方向),也可能是微信压缩后的WebP(EXIF被剥离)。不能只信文件后缀,要用finfo_file($finfo, $path, FILEINFO_MIME_TYPE)确认真实MIME类型。
- WebP方向校正:优先用
Imagick::readImageBlob()加载,再autoOrient();GD无法处理 - HEIC方案:调用
exec('exiftool -Orientation -j ' . escapeshellarg($path))解析,再用convert转JPEG并校正 - 移动端上传图片常带
X-Forwarded-For或User-Agent线索,可结合判断设备类型预设校正策略
EXIF方向校正不是“读出来→转一下→存回去”这么简单。真正卡住人的,往往是那些没报错、但图片越转越歪的静默失败——比如GD旋转后没重置EXIF,或者WebP被当成JPEG去读方向。动手前先用exiftool -v1 your.jpg看原始结构,比盲目写逻辑更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











