HTML表单+PHP脚本上传图片:压缩导致竖图横转问题
解决PHP图片压缩时竖版图片被转为横版的问题
问题根源
竖版图片被转横版的核心原因是图片的EXIF方向元数据未被处理:手机拍摄的竖图会在EXIF信息中记录旋转角度(比如90°、270°),但GD库的imagecreatefromjpeg/imagecreatefrompng等函数默认不会读取并应用这个旋转信息,直接压缩时会按图片原始像素的方向保存,导致显示时方向错误。大尺寸图片频繁出现该问题,是因为这类图片基本由手机拍摄生成,带有完整的EXIF方向数据。
修复后的压缩函数
修改原函数,加入EXIF方向读取与图片旋转逻辑(需确保PHP开启exif扩展):
function compressImage($source, $destination, $quality) { $info = getimagesize($source); $exif = @exif_read_data($source); $orientation = isset($exif['Orientation']) ? $exif['Orientation'] : 1; // 创建图片资源 if ($info['mime'] == 'image/jpeg') $image = imagecreatefromjpeg($source); elseif ($info['mime'] == 'image/gif') $image = imagecreatefromgif($source); elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source); else return false; // 不支持的图片类型 // 根据EXIF方向旋转/翻转图片 switch ($orientation) { case 3: $image = imagerotate($image, 180, 0); break; case 6: $image = imagerotate($image, -90, 0); break; case 8: $image = imagerotate($image, 90, 0); break; case 2: imageflip($image, IMG_FLIP_HORIZONTAL); break; case 4: imageflip($image, IMG_FLIP_VERTICAL); break; case 5: imageflip($image, IMG_FLIP_HORIZONTAL); $image = imagerotate($image, -90, 0); break; case 7: imageflip($image, IMG_FLIP_HORIZONTAL); $image = imagerotate($image, 90, 0); break; } // 保存压缩后的图片 imagejpeg($image, $destination, $quality); imagedestroy($image); // 释放资源 }
关键说明
exif_read_data读取图片的EXIF元数据,@符号用于抑制无EXIF信息时的警告- 不同
Orientation值对应不同的旋转/翻转操作,覆盖所有常见手机拍照方向场景 - 处理完成后用
imagedestroy释放图片资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Tejash Vaishnav
相关产品推荐
相关产品推荐

