如題,相信很多開發者在調用系統照相機接收拍好的照片時,發現照片被無故旋轉了90度。這一問題反映在大部分的三星手機上,當然其他的機器還沒試完全,總之是有問題。 於是乎想到如下的解決辦法: 1. 識別機型,獲取手機型號,然後判斷是否需要旋轉; 2. 通過獲取照片寬度和高度判斷是否需要旋轉; 3. 自己動 ...
如題,相信很多開發者在調用系統照相機接收拍好的照片時,發現照片被無故旋轉了90度。這一問題反映在大部分的三星手機上,當然其他的機器還沒試完全,總之是有問題。
於是乎想到如下的解決辦法:
- 識別機型,獲取手機型號,然後判斷是否需要旋轉;
- 通過獲取照片寬度和高度判斷是否需要旋轉;
- 自己動手寫一個照相機Activity,自己來獲取攝像頭數據,保存照片;
- 分析發生旋轉的照片數據,動態判斷是否需要旋轉,以及旋轉正確的角度。
前三種方法均不是理想的解決方案。
首先說1:這種類似於窮舉的辦法,總會有那些被遺忘的“角落”,維護這些機型會很繁瑣;
然後說2:如果這樣的話,如果剛好用戶要橫屏照照片,還是會發生旋轉;
最後說3:這種方法豈是我等“懶”程式員所能做到的?(PS:其實是需求所限啦,自己寫照相APP,耗時+費精力+容易出bug。好處就在於用戶會感覺自己始終處於同一APP中,而不是發生了跳轉。)
那麼第四種方案是如何做到的呢?
首先通過分析,通常一張照片包含許多EXIF信息。這些信息包含了拍照的設備,曝光度,是否使用了閃光燈種種內容。這其中包括了角度,也就是旋轉問題的癥結所在。
手機自身的照片查看器(某些機型)在顯示照片的時候,會分析這些信息,當分析的角度的信息時,會自動旋轉照片到合適的角度。比較常見的角度是90、180、270。大部分的三星手機在豎屏拍照的時候會拍出角度為90度的照片,橫屏為0度。因此,解決的思路就是按照EXIF中的角度信息進行旋轉即可。主要用到安卓API中的Matrix。關鍵代碼可參考下麵的代碼片:
ExifInterface exifInterface = new ExifInterface(APPCFG.IMAGE_FILE);
int orientationDegree = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Matrix matrix = new Matrix();
matrix.reset();
if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_90) {
matrix.postRotate(90);
}
if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_180) {
matrix.postRotate(180);
}
if (orientationDegree == ExifInterface.ORIENTATION_ROTATE_270) {
matrix.postRotate(270);
}
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);
上述代碼中,bitmap是Bitmap對象,我這裡需要在後面顯示,所以暫時沒有recycle(),提醒大家一下,免得記憶體溢出。
到此,無論是三星還是什麼機型,利用這種通用的方法,即可解決照片旋轉的問題了。