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); } }

 

posted @ 2015-02-26 16:22  billgore  阅读(1756)  评论(0编辑  收藏  举报