部分Android手機拍照后照片被旋轉的解決方案


在部分Android手機(如MT788、Note2)上,使用Camera拍照以后,得到的照片會被自動旋轉(90°、180°、270°),這個情況很不符合預期。仔細分析了一下,因為照片屬性中是存儲了旋轉信息的,所以要解決這個問題,可以在onActivityResult方法中,獲取到照片數據后,讀取它的旋轉信息,如果不是0,說明這個照片已經被旋轉過了,那么再使用android.graphics.Matrix將照片旋轉回去即可。

1、讀取圖片的旋轉屬性

/**
  * 讀取圖片的旋轉的角度
  *
  * @param path
  *            圖片絕對路徑
  * @return 圖片的旋轉角度
  */
private  int  getBitmapDegree(String path) {
     int  degree =  0 ;
     try  {
         // 從指定路徑下讀取圖片,並獲取其EXIF信息
         ExifInterface exifInterface =  new  ExifInterface(path);
         // 獲取圖片的旋轉信息
         int  orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                 ExifInterface.ORIENTATION_NORMAL);
         switch  (orientation) {
         case  ExifInterface.ORIENTATION_ROTATE_90:
             degree =  90 ;
             break ;
         case  ExifInterface.ORIENTATION_ROTATE_180:
             degree =  180 ;
             break ;
         case  ExifInterface.ORIENTATION_ROTATE_270:
             degree =  270 ;
             break ;
         }
     catch  (IOException e) {
         e.printStackTrace();
     }
     return  degree;
}

2、將圖片按照某個角度進行旋轉

/**
  * 將圖片按照某個角度進行旋轉
  *
  * @param bm
  *            需要旋轉的圖片
  * @param degree
  *            旋轉角度
  * @return 旋轉后的圖片
  */
public  static  Bitmap rotateBitmapByDegree(Bitmap bm,  int  degree) {
     Bitmap returnBm =  null ;
  
     // 根據旋轉角度,生成旋轉矩陣
     Matrix matrix =  new  Matrix();
     matrix.postRotate(degree);
     try  {
         // 將原始圖片按照旋轉矩陣進行旋轉,並得到新的圖片
         returnBm = Bitmap.createBitmap(bm,  0 0 , bm.getWidth(), bm.getHeight(), matrix,  true );
     catch  (OutOfMemoryError e) {
     }
     if  (returnBm ==  null ) {
         returnBm = bm;
     }
     if  (bm != returnBm) {
         bm.recycle();
     }
     return  returnBm;
}

OK,用上面兩個方法,就能搞定了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM