手机拍照上传的文件有时候方向会变,文件EXIF信息引起的,有的浏览器不支持解析EXIF就会出现问题,包括一些图片压缩软件/插件/中间件,比如Nginx的image_filter组件以及ImageOptim之类的软件。
解决方案:上传图片检测图片是否存在EXIF信息的旋转标记,清空标记并生成新的图片。
建议跳过GIF图片的处理
/**
* 图片处理/压缩
* @param $path string 原图片路径
* @param string $new_path string 新的图片路径,为空则覆盖原图
* @param int $cr 压缩率,为空则是70%
* @return bool
*/
function imgDeal($path, $new_path = '', $cr = 70) {
$new_path = $new_path ? $new_path : $path;
$exif = exif_read_data($path, 0, true);
$data = @getimagesize($path);
if (!$data) return false;
$w = $data[0];
$h = $data[1];
$xz = 0;
if ($exif && !empty($exif['IFD0'])) {
if (!empty($exif['IFD0']['Orientation'])) {
switch ($exif['IFD0']['Orientation']) {
case 3:
$xz = 180;
break;
case 6:
$xz = -90;
$w = $data[1];
$h = $data[0];
break;
case 8:
$xz = 90;
$w = $data[1];
$h = $data[0];
break;
default:
# code...
break;
}
}
}
//读取旧图片
$src_f = '';
switch ($data[2]) {
case 1:
$src_f = imagecreatefromgif($path);
break;
case 2:
$src_f = imagecreatefromjpeg($path);
break;
case 3:
$src_f = imagecreatefrompng($path);
break;
}
if ($src_f == "") return false;
$rotate = @imagerotate($src_f, $xz, 0);
$newim = imagecreatetruecolor($w,$h);
imagecopyresampled($newim, $rotate, 0, 0, 1, 1, $w, $h, $w - 3, $h - 3);
if (!imagejpeg($newim, $new_path, $cr)) return false;
@imagedestroy($rotate);
@imagedestroy($newim);
return true;
}
...