最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android部分手機(jī)拍照后獲取的圖片被旋轉(zhuǎn)問題的解決方法

 更新時(shí)間:2017年01月17日 14:06:41   作者:ZHU_文濤  
這篇文章主要為大家詳細(xì)介紹了Android部分手機(jī)拍照后獲取的圖片被旋轉(zhuǎn)問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

調(diào)用Android系統(tǒng)拍照功能后,三星手機(jī)拍攝后的照片被旋轉(zhuǎn)了90度,橫著拍給你變成豎的,豎的拍給你變成橫的。其它品牌的手機(jī)都是正常的,就三星出現(xiàn)這個(gè)怪事。

在Android適配上,我原來一直以為國(guó)內(nèi)的小米手機(jī)夠奇葩了,結(jié)果還有更奇葩的!你說你沒事旋轉(zhuǎn)照片干啥,實(shí)在是猜不透其居心何在,純粹是在給開發(fā)者制造麻煩??!

解決辦法是獲取到拍照后照片被旋轉(zhuǎn)的角度,再旋轉(zhuǎn)回去就好了。

具體思路:
1、首先在調(diào)用拍照方法時(shí),保存拍照后的相片原圖,得到原圖路徑,(PhotoBitmapUtils是我自己寫的一個(gè)工具類)

String fileName = ""; 
/** 
 * 啟動(dòng)相機(jī)拍照 
 */ 
private void addBitmapShoots() { 
 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
 // 設(shè)置圖片要保存的 根路徑+文件名 
 fileName = PhotoBitmapUtils.getPhotoFileName(getContext()); 
 File file = new File(fileName); 
 if (!file.exists()) { 
  try { 
   file.createNewFile(); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
 } 
 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
 startActivityForResult(intent, OPEN_CAMERA); 
} 

2、在獲取相機(jī)返回的回調(diào)方法onActivityResult()中,修復(fù)被旋轉(zhuǎn)的圖片并取得修復(fù)后的圖片路徑,有了這個(gè)路徑后就可以展示出來了

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
 super.onActivityResult(requestCode, resultCode, data); 
 // 獲取相機(jī)拍照返回 
 if (resultCode == Activity.RESULT_OK && requestCode == OPEN_CAMERA) { 
  // 得到修復(fù)后的照片路徑 
  String filepath = PhotoBitmapUtils.amendRotatePhoto(fileName, getContext()); 
 } 
} 

PhotoBitmapUtils類:

/** 
 * 集合一些圖片工具 
 * 
 * Created by zhuwentao on 2016-07-22. 
 */ 
public class PhotoBitmapUtils { 
 
 /** 
  * 存放拍攝圖片的文件夾 
  */ 
 private static final String FILES_NAME = "/MyPhoto"; 
 /** 
  * 獲取的時(shí)間格式 
  */ 
 public static final String TIME_STYLE = "yyyyMMddHHmmss"; 
 /** 
  * 圖片種類 
  */ 
 public static final String IMAGE_TYPE = ".png"; 
 
 // 防止實(shí)例化 
 private PhotoBitmapUtils() { 
 } 
 
 /** 
  * 獲取手機(jī)可存儲(chǔ)路徑 
  * 
  * @param context 上下文 
  * @return 手機(jī)可存儲(chǔ)路徑 
  */ 
 private static String getPhoneRootPath(Context context) { 
  // 是否有SD卡 
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 
    || !Environment.isExternalStorageRemovable()) { 
   // 獲取SD卡根目錄 
   return context.getExternalCacheDir().getPath(); 
  } else { 
   // 獲取apk包下的緩存路徑 
   return context.getCacheDir().getPath(); 
  } 
 } 
 
 /** 
  * 使用當(dāng)前系統(tǒng)時(shí)間作為上傳圖片的名稱 
  * 
  * @return 存儲(chǔ)的根路徑+圖片名稱 
  */ 
 public static String getPhotoFileName(Context context) { 
  File file = new File(getPhoneRootPath(context) + FILES_NAME); 
  // 判斷文件是否已經(jīng)存在,不存在則創(chuàng)建 
  if (!file.exists()) { 
   file.mkdirs(); 
  } 
  // 設(shè)置圖片文件名稱 
  SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault()); 
  Date date = new Date(System.currentTimeMillis()); 
  String time = format.format(date); 
  String photoName = "/" + time + IMAGE_TYPE; 
  return file + photoName; 
 } 
 
 /** 
  * 保存Bitmap圖片在SD卡中 
  * 如果沒有SD卡則存在手機(jī)中 
  * 
  * @param mbitmap 需要保存的Bitmap圖片 
  * @return 保存成功時(shí)返回圖片的路徑,失敗時(shí)返回null 
  */ 
 public static String savePhotoToSD(Bitmap mbitmap, Context context) { 
  FileOutputStream outStream = null; 
  String fileName = getPhotoFileName(context); 
  try { 
   outStream = new FileOutputStream(fileName); 
   // 把數(shù)據(jù)寫入文件,100表示不壓縮 
   mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
   return fileName; 
  } catch (Exception e) { 
   e.printStackTrace(); 
   return null; 
  } finally { 
   try { 
    if (outStream != null) { 
     // 記得要關(guān)閉流! 
     outStream.close(); 
    } 
    if (mbitmap != null) { 
     mbitmap.recycle(); 
    } 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
 
 /** 
  * 把原圖按1/10的比例壓縮 
  * 
  * @param path 原圖的路徑 
  * @return 壓縮后的圖片 
  */ 
 public static Bitmap getCompressPhoto(String path) { 
  BitmapFactory.Options options = new BitmapFactory.Options(); 
  options.inJustDecodeBounds = false; 
  options.inSampleSize = 10; // 圖片的大小設(shè)置為原來的十分之一 
  Bitmap bmp = BitmapFactory.decodeFile(path, options); 
  options = null; 
  return bmp; 
 } 
 
 /** 
  * 處理旋轉(zhuǎn)后的圖片 
  * @param originpath 原圖路徑 
  * @param context 上下文 
  * @return 返回修復(fù)完畢后的圖片路徑 
  */ 
 public static String amendRotatePhoto(String originpath, Context context) { 
 
  // 取得圖片旋轉(zhuǎn)角度 
  int angle = readPictureDegree(originpath); 
 
  // 把原圖壓縮后得到Bitmap對(duì)象 
  Bitmap bmp = getCompressPhoto(originpath);; 
 
  // 修復(fù)圖片被旋轉(zhuǎn)的角度 
  Bitmap bitmap = rotaingImageView(angle, bmp); 
 
  // 保存修復(fù)后的圖片并返回保存后的圖片路徑 
  return savePhotoToSD(bitmap, context); 
 } 
 
 /** 
  * 讀取照片旋轉(zhuǎn)角度 
  * 
  * @param path 照片路徑 
  * @return 角度 
  */ 
 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; 
 } 
 
 /** 
  * 旋轉(zhuǎn)圖片 
  * @param angle 被旋轉(zhuǎn)角度 
  * @param bitmap 圖片對(duì)象 
  * @return 旋轉(zhuǎn)后的圖片 
  */ 
 public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { 
  Bitmap returnBm = null; 
  // 根據(jù)旋轉(zhuǎn)角度,生成旋轉(zhuǎn)矩陣 
  Matrix matrix = new Matrix(); 
  matrix.postRotate(angle); 
  try { 
   // 將原始圖片按照旋轉(zhuǎn)矩陣進(jìn)行旋轉(zhuǎn),并得到新的圖片 
   returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
  } catch (OutOfMemoryError e) { 
  } 
  if (returnBm == null) { 
   returnBm = bitmap; 
  } 
  if (bitmap != returnBm) { 
   bitmap.recycle(); 
  } 
  return returnBm; 
 } 
} 

在調(diào)用修復(fù)圖片角度方法的時(shí)候需要注意,現(xiàn)在的手機(jī)像素越來越大,拍完后一張照片有近10M,所以我們需要對(duì)圖片進(jìn)行壓縮處理。不然在保存圖片時(shí)會(huì)等待挺久的,屏幕會(huì)黑一會(huì)。
參考文檔1
參考文檔2

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 用 camera2 API 自定義相機(jī)

    Android 用 camera2 API 自定義相機(jī)

    本文主要介紹了Android 用 camera2 API 自定義相機(jī)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • Android ListView詳解

    Android ListView詳解

    listview控件在項(xiàng)目開發(fā)過程中經(jīng)常會(huì)用到,本文給大家分享android listview相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Android獲取通話時(shí)間實(shí)例分析

    Android獲取通話時(shí)間實(shí)例分析

    我們知道安卓系統(tǒng)中通話時(shí)長(zhǎng)應(yīng)該是歸Callog管,所以建議去查查ContactProvider,或者是TelephonyProvider,本文也總結(jié)了一些,需要的朋友可以參考下
    2012-12-12
  • Kotlin中的高階函數(shù)深入講解

    Kotlin中的高階函數(shù)深入講解

    這篇文章主要給大家介紹了關(guān)于Kotlin中高階函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Android 自定義View的構(gòu)造函數(shù)詳細(xì)介紹

    Android 自定義View的構(gòu)造函數(shù)詳細(xì)介紹

    這篇文章主要介紹了Android 自定義View的構(gòu)造函數(shù)詳細(xì)介紹的相關(guān)資料,這里對(duì)構(gòu)造函數(shù)進(jìn)行了對(duì)比按需使用,需要的朋友可以參考下
    2016-12-12
  • Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁(yè)導(dǎo)航效果

    Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁(yè)導(dǎo)航效果

    這篇文章主要介紹了Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁(yè)導(dǎo)航效果,代碼簡(jiǎn)單易懂,感興趣的朋友參考下吧
    2016-09-09
  • Android中ScrollView實(shí)現(xiàn)滑動(dòng)距離監(jiān)聽器的方法

    Android中ScrollView實(shí)現(xiàn)滑動(dòng)距離監(jiān)聽器的方法

    ScrollView相信對(duì)每位Android開發(fā)者們來說都不陌生,所以這篇文章給大家主要介紹了Android中ScrollView實(shí)現(xiàn)滑動(dòng)距離監(jiān)聽器的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • Android?SearchView搜索控件使用方法詳解

    Android?SearchView搜索控件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android?SearchView搜索控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android 驅(qū)動(dòng)編寫LED-NDK程序

    Android 驅(qū)動(dòng)編寫LED-NDK程序

    這篇文章主要介紹了Android 驅(qū)動(dòng)編寫LED-NDK程序的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android Kotlin Flow 冷熱流詳解

    Android Kotlin Flow 冷熱流詳解

    在Android開發(fā)中,Flow是Kotlin協(xié)程庫(kù)的重要組成部分,用于處理異步數(shù)據(jù)流,它能夠異步生產(chǎn)多個(gè)值,類似于RxJava中的Observable,本文介紹Android Kotlin Flow 冷熱流,感興趣的朋友一起看看吧
    2024-11-11

最新評(píng)論

上饶县| 建德市| 淮阳县| 蓬安县| 丹寨县| 江口县| 门源| 南涧| 米脂县| 海南省| 张家界市| 三台县| 繁昌县| 扎兰屯市| 汤阴县| 隆德县| 开鲁县| 吴堡县| 舒城县| 丰顺县| 舞阳县| 禄丰县| 平顺县| 子洲县| 芷江| 洛隆县| 巴马| 镶黄旗| 清水河县| 称多县| 南郑县| 蒙自县| 阜新市| 洞头县| 根河市| 安义县| 胶南市| 建宁县| 张家港市| 东阳市| 蓬莱市|