解决上传iphone拍照的图片自动翻转的问题

昨天遇到一个奇怪的问题,客户用iphone拍照后上传的图片在生成缩略图时被翻转了,
原图
 
 缩略图
然后我排查image类的问题,怀疑可能是这里出bug了,结果并不是这样,断点调试后发现getimagesize这里获取的宽高和电脑显示的刚好是相反的,难道是php的gd组建的问题?

于是我又用js获取,和我php获取的是一样的,
 
但是在文件属性里确实正常的
然后java,go都有问题,可见这肯定是图片存储信息的问题了
然后百度搜索到“JS获取iphone图库中图片的宽高异常”http://segmentfault.com/q/1010000000501742 
果然是iphone获取图片的问题,并找到了解决方案
php代码
 
     
$exif = exif_read_data($picAddr);
$image = imagecreatefromjpeg($picAddr);
if($exif['Orientation'] == 3) {
$result = imagerotate($image, 180, 0);
imagejpeg($result, $picAddr, 100);
} elseif($exif['Orientation'] == 6) {
$result = imagerotate($image, -90, 0);
imagejpeg($result, $picAddr, 100);
} elseif($exif['Orientation'] == 8) {
$result = imagerotate($image, 90, 0);
imagejpeg($result, $picAddr, 100);
}
isset($result) && imagedestroy($result);
imagedestroy($image);
原来和图片 exif信息的 这个参数有关系 Orientation,原来 用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。
如果我们忽略orientation信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。
所以,在对照片进行处理之前,先将照片旋转到正确的方向,并且返回的imageOrientaion为0。
下面这个方法就是一个UIImage category中的方法,用它可以达到以上目的。
 
 于是问题解决

你可能感兴趣的:(PHP学习园)