PHP无需Imagick扩展移除图片方向EXIF信息的实现方法
GD库实现EXIF移除+方向修正方案
GD库重新生成并保存图片时,默认不会写入任何EXIF信息,天然满足剥离EXIF的需求。只需要在检测到非1的方向参数时,按照EXIF标准将图片旋转/翻转至正确朝向,再覆盖原文件即可,处理后的图片可直接进入后续缩放流程,不会再出现异常旋转问题。
EXIF方向参数对应操作规则
不同Orientation值对应的GD处理逻辑如下:
- 2:水平翻转图片
- 3:将图片旋转180度
- 4:垂直翻转图片
- 5:垂直翻转后顺时针旋转90度
- 6:顺时针旋转90度
- 7:水平翻转后顺时针旋转90度
- 8:逆时针旋转90度
替换后完整函数代码
function removeExif($filename) { if (!function_exists('exif_read_data')) { return false; } $exif = exif_read_data($filename); if(!$exif || !isset($exif['Orientation']) || $exif['Orientation'] == 1){ return true; } $orientation = $exif['Orientation']; // 获取图片基础信息,匹配对应GD加载函数 $imgInfo = getimagesize($filename); $mime = $imgInfo['mime']; switch ($mime) { case 'image/jpeg': $img = imagecreatefromjpeg($filename); $saveFunc = 'imagejpeg'; break; case 'image/png': $img = imagecreatefrompng($filename); $saveFunc = 'imagepng'; break; case 'image/gif': $img = imagecreatefromgif($filename); $saveFunc = 'imagegif'; break; default: // 不支持的格式直接返回 return false; } // 根据方向值做对应变换 switch ($orientation) { case 2: imageflip($img, IMG_FLIP_HORIZONTAL); break; case 3: $img = imagerotate($img, 180, 0); break; case 4: imageflip($img, IMG_FLIP_VERTICAL); break; case 5: imageflip($img, IMG_FLIP_VERTICAL); $img = imagerotate($img, 90, 0); break; case 6: $img = imagerotate($img, -90, 0); break; case 7: imageflip($img, IMG_FLIP_HORIZONTAL); $img = imagerotate($img, 90, 0); break; case 8: $img = imagerotate($img, 90, 0); break; } // 覆盖保存原文件,GD保存默认不携带EXIF,JPEG可传第三个参数设置质量0-100,例:$saveFunc($img, $filename, 90) $saveFunc($img, $filename); // 释放内存 imagedestroy($img); return true; }
注意事项
- 该实现依赖PHP内置GD库,不需要安装任何额外扩展,
exif_read_data、GD相关处理函数均为PHP默认启用的原生能力 - 处理PNG、GIF格式时注意保留原有的透明度配置,可根据业务需要补充对应的alpha通道保留逻辑
- 保存后的图片已完全移除所有EXIF信息,方向为正确的物理朝向,后续执行缩放、生成缩略图逻辑时不会再出现方向错误
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

