如題柜蜈,相信很多開(kāi)發(fā)者在調(diào)用系統(tǒng)照相機(jī)接收拍好的照片時(shí)约谈,發(fā)現(xiàn)照片被無(wú)故旋轉(zhuǎn)了90度。這一問(wèn)題反映在大部分的三星手機(jī)上质和,當(dāng)然其他的機(jī)器還沒(méi)試完全稳摄,總之是有問(wèn)題。
于是乎想到如下的解決辦法:
識(shí)別機(jī)型饲宿,獲取手機(jī)型號(hào)厦酬,然后判斷是否需要旋轉(zhuǎn);
通過(guò)獲取照片寬度和高度判斷是否需要旋轉(zhuǎn)瘫想;
自己動(dòng)手寫(xiě)一個(gè)照相機(jī)Activity仗阅,自己來(lái)獲取攝像頭數(shù)據(jù),保存照片国夜;
分析發(fā)生旋轉(zhuǎn)的照片數(shù)據(jù)减噪,動(dòng)態(tài)判斷是否需要旋轉(zhuǎn),以及旋轉(zhuǎn)正確的角度车吹。
前三種方法均不是理想的解決方案筹裕。
首先說(shuō)1:這種類似于窮舉的辦法,總會(huì)有那些被遺忘的“角落”窄驹,維護(hù)這些機(jī)型會(huì)很繁瑣朝卒;
然后說(shuō)2:如果這樣的話,如果剛好用戶要橫屏照照片馒吴,還是會(huì)發(fā)生旋轉(zhuǎn)扎运;
最后說(shuō)3:這種方法豈是我等“懶”程序員所能做到的?(PS:其實(shí)是需求所限啦饮戳,自己寫(xiě)照相APP,耗時(shí)+費(fèi)精力+容易出bug洞拨。好處就在于用戶會(huì)感覺(jué)自己始終處于同一APP中扯罐,而不是發(fā)生了跳轉(zhuǎn)。)
那么第四種方案是如何做到的呢烦衣?
首先通過(guò)分析歹河,通常一張照片包含許多EXIF信息。這些信息包含了拍照的設(shè)備花吟,曝光度秸歧,是否使用了閃光燈種種內(nèi)容。這其中包括了角度衅澈,也就是旋轉(zhuǎn)問(wèn)題的癥結(jié)所在键菱。
手機(jī)自身的照片查看器(某些機(jī)型)在顯示照片的時(shí)候,會(huì)分析這些信息今布,當(dāng)分析的角度的信息時(shí)经备,會(huì)自動(dòng)旋轉(zhuǎn)照片到合適的角度拭抬。比較常見(jiàn)的角度是90、180侵蒙、270造虎。大部分的三星手機(jī)在豎屏拍照的時(shí)候會(huì)拍出角度為90度的照片,橫屏為0度纷闺。因此算凿,解決的思路就是按照EXIF中的角度信息進(jìn)行旋轉(zhuǎn)即可。主要用到安卓API中的Matrix犁功。關(guān)鍵代碼可參考下面的代碼片:
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對(duì)象,我這里需要在后面顯示波桩,所以暫時(shí)沒(méi)有recycle()戒努,提醒大家一下,免得內(nèi)存溢出镐躲。
到此储玫,無(wú)論是三星還是什么機(jī)型,利用這種通用的方法萤皂,即可解決照片旋轉(zhuǎn)的問(wèn)題了撒穷。