最近作項目的時候遇到一個問題,獲取相冊中的圖片或者拍照到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之中。接口