Android通過(guò)ExifInterface判斷Camera圖片方向的方法
Android的Camera相關(guān)應(yīng)用開(kāi)發(fā)中,有一個(gè)必須搞清楚的知識(shí)點(diǎn),就是Camera的預(yù)覽方向和拍照方向
圖像的Sensor方向:手機(jī)Camera的圖像數(shù)據(jù)都是來(lái)自于攝像頭硬件的圖像傳感器(Image Sensor),這個(gè)Sensor被固定到手機(jī)之后是有一個(gè)默認(rèn)的取景方向的,這個(gè)方向如下圖所示,坐標(biāo)原點(diǎn)位于手機(jī)橫放時(shí)的左上角:
android應(yīng)用里使用相機(jī)圖片時(shí)必須要考慮的一個(gè)問(wèn)題就是圖片朝向,只有判斷對(duì)朝向才能調(diào)整圖片從而更好的展現(xiàn)。本文將介紹一種通過(guò)ExifInterface判斷圖片朝向的方法!上代碼:
/** * 利用給定路徑下的圖片設(shè)置ImageView * @param imgPath 手機(jī)圖片文件路徑 * @param imgView 需要設(shè)置的ImageView */ public void setImg(String imgPath, ImageView imgView) { File file = new File(imgPath); if (file.exists() && file.canRead()) { // -------1.圖片縮放-------- // 手機(jī)屏幕信息 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int dw = metric.widthPixels; // 屏幕寬 int dh = metric.heightPixels; // 屏幕高 // 加載圖像,只是為了獲取尺寸 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 設(shè)置之后可以獲取尺寸信息 Bitmap bitmap = BitmapFactory.decodeFile(imgPath, options); // 計(jì)算水平和垂直縮放系數(shù) int heightRatio = (int) Math.ceil(options.outHeight / (float) dh); int widthRatio = (int) Math.ceil(options.outWidth / (float) dw); // 判斷哪個(gè)大 if (heightRatio > 1 && widthRatio > 1) { if (heightRatio > widthRatio) { options.inSampleSize = heightRatio; } else { options.inSampleSize = widthRatio; } } // 圖片縮放 options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(imgPath, options); // -------2.判斷圖片朝向-------- try { ExifInterface exif = new ExifInterface(imgPath); int degree = 0; // 圖片旋轉(zhuǎn)角度 if (exif != null) { int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, -1); if (orientation != -1) { 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; default: break; } } } if (degree != 0) { // 圖片需要旋轉(zhuǎn) int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preRotate(degree); Bitmap mRotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); imgView.setImageBitmap(mRotateBitmap); } else { imgView.setImageBitmap(bitmap); } } catch (IOException e) { } } }
本代碼包含兩大功能:
1. 圖片縮放:原始圖片一般比較大,經(jīng)過(guò)縮小才能使用;
2. 圖片旋轉(zhuǎn):由于用戶拍照時(shí)手機(jī)角度不同,所得照片可能需要旋轉(zhuǎn)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼功能
- Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案
- Android仿淘寶訂單頁(yè)面效果
- Android自定義view制作抽獎(jiǎng)轉(zhuǎn)盤
- Android自定義View實(shí)現(xiàn)餅狀圖帶動(dòng)畫效果
- Android通過(guò)代碼控制ListView上下滾動(dòng)的方法
- Android使用AsyncTask加載圖片的操作流程
- Android Usb設(shè)備的監(jiān)聽(tīng)(Dev)外設(shè)端口的判定以及耳機(jī)的插拔
- Android開(kāi)發(fā)手機(jī)無(wú)線調(diào)試的方法
- 關(guān)于Touch Panel AA區(qū)要做外擴(kuò)的原因解析
相關(guān)文章
Android SDK Manager更新、下載速度慢問(wèn)題解決辦法
這篇文章主要介紹了Android SDK Manager更新、下載速度慢問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05Flutter的鍵值存儲(chǔ)數(shù)據(jù)庫(kù)使用示例詳解
這篇文章主要為大家介紹了Flutter的鍵值存儲(chǔ)數(shù)據(jù)庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android中使用Notification實(shí)現(xiàn)狀態(tài)欄的通知
本文主要介紹了android利用Notification實(shí)現(xiàn)狀態(tài)欄的通知的示例代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04Android編程設(shè)置全屏的方法實(shí)例詳解
這篇文章主要介紹了Android編程設(shè)置全屏的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android設(shè)置全屏的兩種常見(jiàn)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-11-11詳解Android 多級(jí)聯(lián)動(dòng)控件實(shí)現(xiàn)思路討論
這篇文章主要介紹了詳解Android 多級(jí)聯(lián)動(dòng)控件實(shí)現(xiàn)思路討論,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11