input标签上传手机照片时,由于不同手机型号的摄像头造成照片旋转的解决办法
年前做了一个项目是关于手机端或者微信上传分享图片进行抽奖的。用得是input标签选择图片上传,因为是用得PC端开发,做完后发现手机上传图片的时候会出现2种情况,一个是图片正常上传,另外一种是有一些图片上传后会出现照片旋转了90度。一般会出现旋转的都是用手机拍的照片。因为以前甚少接触手机端,所以也花费和许多时间来研究和解决这个问题。
网上一番搜索,发现手机上会有各种不同的Camera,机子带的和各种软件带的。设置不同拍照后会对照片进行不同的处理,所以我想照片旋转了应该就是Camera不同处理所造成的。解决办法就是先要读取照片的exif信息,获取照片的Orientation方向,看看之前是否已经旋转了照片,再根据旋转的度数进行还原。
在php查看照片的exif信息需要开启php_mbstring扩展和php_exif扩展,再用exif_read_data()函数查询exif信息。另外exif_read_data()函数只支持jpeg类型的照片,所以处理照片前要先判定照片是不是JPEG类型的。用exif_imagetype()来判定,的到的类型如下
print_r(exif_imagetype("c:/a")); #可以准确判断图片的类型 返回整形 对应图片常量 图像类型常量 值 常量 1 MAGETYPE_GIF 2 IMAGETYPE_JPEG 3 IMAGETYPE_PNG 4 IMAGETYPE_SWF 5 IMAGETYPE_PSD 6 IMAGETYPE_BMP 7 IMAGETYPE_TIFF_II(Intel 字节顺序) 8 IMAGETYPE_TIFF_MM(Motorola 字节顺序) 9 IMAGETYPE_JPC 10 IMAGETYPE_JP2 11 IMAGETYPE_JPX 12 IMAGETYPE_JB2 13 IMAGETYPE_SWC 14 IMAGETYPE_IFF 15 IMAGETYPE_WBMP
得到照片的类型后,判定是2的jpeg类型,然后获取exif信息,再用imagerotate()旋转还原照片。
//检查图像是否旋转,是则旋转回正常的角度 //$image_path 图片的地址,不能使URL
//$degrees 图片需要旋转的度数
//$imgInfo['IFD0']['Orientation']所指的方向是镜头旋转的方向,不是图片旋转的方向
$exifType = exif_imagetype($image_path); if($exifType == 2){ $imgInfo = exif_read_data($image_path,0,1); if ($imgInfo['IFD0']['Orientation'] != 1 && isset($imgInfo['IFD0']['Orientation'])) { switch($imgInfo['IFD0']['Orientation']){ case '6': $degrees = -90; break; case '3': $degrees = -180; break; case '8': $degrees = -270; break; } $imgdata = @getimagesize($image_path); switch ($imgdata[2]) { case 1: $src_f = imagecreatefromgif($image_path); break; case 2: $src_f = imagecreatefromjpeg($image_path); break; case 3: $src_f = imagecreatefrompng($image_path); break; } $rotate = @imagerotate($src_f, $degrees,0); imagejpeg($rotate,$image_path,100); @imagedestroy($rotate); } }