最近作项目的时候遇到一个问题,获取相册中的图片或者拍照到ImageView中时,显示在ImageView中的图片方向旋转了,上网百度了一下,终于找到了解决方法。java
首先咱们要知道问题出在哪里,通过查看手机相册里面的图片的详细信息,我发现其中有方向这个属性,若是方向是0,则显示在ImageView中的图片方向是正的,而若是方向是90度或者180或者270度,那么显示在ImageView中的图片方向就不正,问题的根源在于存储在手机相册里面的图片的方向有了角度致使显示不正。我一开始一直认为是imageView的显示出了问题,始终找不到解决办法,所以在遇到问题的时候,了解错误的根源才能有效地解决问题,否则就是白费功夫。android
下面言归正传,了解到问题所在以后,接下来就是如何解决问题了,既然问题是图片的方向,咱们就能够先获取到图片的方向角度,而后旋转把图片方向方正,再显示到imageView中,那么显示出来的图片方向就是正的了。post
如何获取和改变图片的方向呢,android中提供了一个ExifInterface接口,用于获取图像文件的信息:spa
//根据图片的filepath获取到一个ExifInterface的对象 ExifInterface exif = null; try { exif = new ExifInterface(filepath); } catch (IOException e) { e.printStackTrace(); exif = null; }
接下来获取图片的方向角度:code
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); }
此时获得的Bitmap就是通过旋转后的Bitmap,显示出来的方向是正的,若是图片较大,还能够对其进行必定的压缩操做以后在放入ImageView之中。接口