最近做项目的时候遇到一个问题,获取相册中的图片或者拍照到ImageView中时,显示在ImageView中的图片方向旋转了,上网百度了一下,终于找到了解决方法。

首先我们要知道问题出在哪里,经过查看手机相册里面的图片的详细信息,我发现其中有方向这个属性,如果方向是0,则显示在ImageView中的图片方向是正的,而如果方向是90度或者180或者270度,那么显示在ImageView中的图片方向就不正,问题的根源在于存储在手机相册里面的图片的方向有了角度导致显示不正。我一开始一直认为是imageView的显示出了问题,始终找不到解决办法,因此在遇到问题的时候,了解错误的根源才能有效地解决问题,不然就是白费功夫。

下面言归正传,了解到问题所在之后,接下来就是如何解决问题了,既然问题是图片的方向,我们就可以先获取到图片的方向角度,然后旋转把图片方向方正,再显示到imageView中,那么显示出来的图片方向就是正的了。

如何获取和改变图片的方向呢,android中提供了一个ExifInterface接口,用于获取图像文件的信息:

//根据图片的filepath获取到一个ExifInterface的对象
 ExifInterface exif = null;  
         try {  
             exif = new ExifInterface(filepath);  
         } catch (IOException e) {  
             e.printStackTrace();  
             exif = null;  
         }
 //根据图片的filepath获取到一个ExifInterface的对象
 ExifInterface exif = null;  
         try {  
             exif = new ExifInterface(filepath);  
         } catch (IOException e) {  
             e.printStackTrace();  
             exif = null;  
         }

 接下来获取图片的方向角度:

int degree=0;
if (exif != null) {  
             // 读取图片中相机方向信息  
             int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,  
                     ExifInterface.ORIENTATION_UNDEFINED);  
             // 计算旋转角度  
             switch (ori) {  
             case ExifInterface.ORIENTATION_ROTATE_90:  
                 digree = 90;  
                 break;  
             case ExifInterface.ORIENTATION_ROTATE_180:  
                 digree = 180;  
                 break;  
             case ExifInterface.ORIENTATION_ROTATE_270:  
                 digree = 270;  
                 break;  
             default:  
                 digree = 0;  
                 break;  
             }
int degree=0;
if (exif != null) {  
             // 读取图片中相机方向信息  
             int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,  
                     ExifInterface.ORIENTATION_UNDEFINED);  
             // 计算旋转角度  
             switch (ori) {  
             case ExifInterface.ORIENTATION_ROTATE_90:  
                 digree = 90;  
                 break;  
             case ExifInterface.ORIENTATION_ROTATE_180:  
                 digree = 180;  
                 break;  
             case ExifInterface.ORIENTATION_ROTATE_270:  
                 digree = 270;  
                 break;  
             default:  
                 digree = 0;  
                 break;  
             }

获取到角度之后,就是要根据角度来旋转图片使其的角度变为0,在android中提供了对Bitmap进行矩阵旋转的操作:

if (digree != 0) {  
             // 旋转图片  
             Matrix m = new Matrix();  
             m.postRotate(digree);  
             bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),  
            		 bitmap.getHeight(), m, true);  
         }
 if (digree != 0) {  
             // 旋转图片  
             Matrix m = new Matrix();  
             m.postRotate(digree);  
             bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),  
            		 bitmap.getHeight(), m, true);  
         }

此时得到的Bitmap就是经过旋转后的Bitmap,显示出来的方向是正的,如果图片较大,还可以对其进行一定的压缩操作之后在放入ImageView之中。