解決android有的手機(jī)拍照后上傳圖片被旋轉(zhuǎn)的問題
需求:做仿新浪發(fā)微博的項(xiàng)目,能夠上傳圖片還有兩外一個(gè)項(xiàng)目用到手機(jī)拍攝圖片,這兩個(gè)都需要把圖片上傳到服務(wù)器
遇到問題:有的手機(jī)拍攝的圖片旋轉(zhuǎn)90度,有的圖片旋轉(zhuǎn)了180度,有的手機(jī)是正常的,服務(wù)器要求的是正的,這樣問題就來(lái)了,不能用戶發(fā)個(gè)照片在微博上看到的是被旋轉(zhuǎn)了的啊,另外一個(gè)項(xiàng)目里旋轉(zhuǎn)了的圖片直接匹配出現(xiàn)問題,這個(gè)更嚴(yán)重。
解決:開始的時(shí)候在網(wǎng)上沒有找到很好的解決辦法,谷歌百度的搜了一通,想到第一種解決方式,當(dāng)手機(jī)拍照結(jié)束,在返回結(jié)果處理里面立即跳轉(zhuǎn)到一個(gè)新的頁(yè)面,在新的頁(yè)面里讓用戶自己手動(dòng)去旋轉(zhuǎn)圖片,然后點(diǎn)擊確定。就可以上傳到服務(wù)器正著的圖片了;第二種解決方式,這是在論壇里發(fā)現(xiàn)的一個(gè)方法,可以獲取圖片的屬性,讀取圖片的旋轉(zhuǎn)角度。
第一種方式代碼:
在onActivityResult里面處理跳轉(zhuǎn)
<span style="font-size:18px;"> Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class); MyApp myApp = (MyApp)getApplication(); myApp.setName(bitmap);//修改之后的名稱 myApp.setPhoto(isPhoto); startActivityForResult(intent, 1);</span>
在RotaingActivity里面就可以作相應(yīng)的旋轉(zhuǎn)處理了
<span style="font-size:18px;"> //獲取bitmap MyApp myApp = (MyApp)getApplication(); bitmap = myApp.getName(); System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight()); myBitmap = bitmap; myWidth = bitmap.getWidth(); myHeight = bitmap.getHeight(); // 創(chuàng)建操作圖片用的matrix對(duì)象 matrix = new Matrix(); Drawable drawable = ImageDispose.bitmapToDrawable(bitmap); imageView.setBackgroundDrawable(drawable); btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { RotaingActivity.this.finish(); } }); btnRightRotaing.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myBitmap = rotaingImageView(-90); } }); btnLeftRotaing.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myBitmap = rotaingImageView(+90); } }); btnOK.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { MyApp myApp = (MyApp)getApplication(); myApp.setName(myBitmap);//修改之后 System.out.println("OK resultcoder"); Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class); setResult(6, intent); RotaingActivity.this.finish(); } }); } private Bitmap rotaingImageView(int angle2) { //旋轉(zhuǎn)圖片 動(dòng)作 matrix.postRotate(angle2); System.out.println("angle2=" + angle2); // 創(chuàng)建新的圖片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, myWidth, myHeight, matrix, true); Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap); imageView.setBackgroundDrawable(drawable); return resizedBitmap; }</span>
第二種方式:就簡(jiǎn)單多了,直接自己出偷著把照片給處理了,不需要用戶的操作,這樣體驗(yàn)會(huì)更好一點(diǎn)。
在onActivityResult里面處理
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 8; File file = new File(SD_CARD_TEMP_DIR); /** * 獲取圖片的旋轉(zhuǎn)角度,有些系統(tǒng)把拍照的圖片旋轉(zhuǎn)了,有的沒有旋轉(zhuǎn) */ int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
<span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions); bitmap = cameraBitmap; /** * 把圖片旋轉(zhuǎn)為正的方向 */ bitmap = ImageDispose.rotaingImageView(degree, bitmap); upload(bitmap);</span>
<span style="font-size:18px;"> /** * 旋轉(zhuǎn)圖片 * @param angle * @param bitmap * @return Bitmap */ public static Bitmap rotaingImageView(int angle , Bitmap bitmap) { //旋轉(zhuǎn)圖片 動(dòng)作 Matrix matrix = new Matrix();; matrix.postRotate(angle); System.out.println("angle2=" + angle); // 創(chuàng)建新的圖片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); return resizedBitmap; }</span>
/** * 讀取圖片屬性:旋轉(zhuǎn)的角度 * @param path 圖片絕對(duì)路徑 * @return degree旋轉(zhuǎn)的角度 */ public static int readPictureDegree(String path) { int degree = 0; try { 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; }
這樣就搞定了,此時(shí)你上傳的照片就是正的了。
第一種方式的圖片
以上就是對(duì)解決android有的手機(jī)拍照后上傳圖片被旋轉(zhuǎn)的問題,謝謝大家對(duì)本站的支持!
- Android基于OkHttp實(shí)現(xiàn)下載和上傳圖片
- Android實(shí)現(xiàn)上傳圖片至java服務(wù)器
- Android Oss上傳圖片的使用示例
- Android使用OkHttp上傳圖片的實(shí)例代碼
- Android 通過(guò)Base64上傳圖片到服務(wù)器實(shí)現(xiàn)實(shí)例
- Android開發(fā)中調(diào)用系統(tǒng)相冊(cè)上傳圖片到服務(wù)器OPPO等部分手機(jī)上出現(xiàn)短暫的顯示桌面問題的解決方法
- Android 開發(fā) 使用WebUploader解決安卓微信瀏覽器上傳圖片中遇到的bug
- Android使用post方式上傳圖片到服務(wù)器的方法
- Android Retrofit 2.0框架上傳圖片解決方案
- Android異步上傳圖片到PHP服務(wù)器
- android上傳圖片到PHP的過(guò)程詳解
- Android實(shí)現(xiàn)本地上傳圖片并設(shè)置為圓形頭像
- Android 使用騰訊X5瀏覽器上傳圖片的示例
相關(guān)文章
OpenHarmony實(shí)現(xiàn)屏幕亮度動(dòng)態(tài)調(diào)節(jié)方法詳解
大家在拿到dayu之后,都吐槽說(shuō),會(huì)經(jīng)常熄屏,不利于調(diào)試,那么有沒有一種辦法,可以讓app不熄屏呢,答案是有的,今天我們就來(lái)揭秘一下,如何控制屏幕亮度2022-11-11Android中用RxJava和ViewPager實(shí)現(xiàn)輪播圖
現(xiàn)在App中實(shí)現(xiàn)一個(gè)輪播圖已經(jīng)是很多產(chǎn)品的標(biāo)配了,這篇文章給大家詳細(xì)介紹了如何利用RxJava和ViewPager實(shí)現(xiàn)輪播圖,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-09-09Android實(shí)現(xiàn)紅包雨動(dòng)畫效果
本篇文章主要介紹了Android實(shí)現(xiàn)紅包雨動(dòng)畫效果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候)
這篇文章主要介紹了flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Flutter開發(fā)之支持放大鏡的輸入框功能實(shí)現(xiàn)
在Flutter開發(fā)時(shí),有時(shí)為了優(yōu)化用戶輸入體驗(yàn),往往會(huì)需要輸入框支持在移動(dòng)光標(biāo)過(guò)程中可以出現(xiàn)放大鏡功能。本文將為大家介紹實(shí)現(xiàn)的方法,需要的可以參考一下2022-02-02android 下載時(shí)文件名是中文和空格會(huì)報(bào)錯(cuò)解決方案
項(xiàng)目中遇到了下載文件文件名是中文而且還有空格如果不對(duì)連接進(jìn)行處理下載就會(huì)報(bào)錯(cuò)要想解決這個(gè)問題只需對(duì)你的url進(jìn)行編碼然后替換空格用編碼表示,感興趣的朋友可以詳細(xì)了解下2013-01-01Android錄制語(yǔ)音文件wav轉(zhuǎn)mp3的方法示例
這篇文章主要介紹了Android錄制語(yǔ)音文件wav轉(zhuǎn)mp3的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Android使用GridView實(shí)現(xiàn)日歷功能示例(詳細(xì)代碼)
本篇文章主要介紹了Android使用GridView實(shí)現(xiàn)日歷功能示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2017-01-01Android開發(fā)中ImageLoder進(jìn)行圖片加載和緩存
這篇文章主要介紹了Android開發(fā)中ImageLoder進(jìn)行圖片加載和緩存的相關(guān)資料,需要的朋友可以參考下2016-04-04淺析Android Service中實(shí)現(xiàn)彈出對(duì)話框的坑
這篇文章主要介紹了Android Service中實(shí)現(xiàn)彈出對(duì)話框的坑,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04