老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

詳解android通過uri獲取bitmap圖片并壓縮

詳解android 通過uri獲取bitmap圖片并壓縮

成都創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都做網(wǎng)站、成都網(wǎng)站制作、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。成都創(chuàng)新互聯(lián)公司為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,成都創(chuàng)新互聯(lián)公司核心團(tuán)隊十年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。

很多人在調(diào)用圖庫選擇圖片時會在onActivityResult中用Media.getBitmap來獲取返回的圖片,如下:

Uri mImageCaptureUri = data.getData();
Bitmap photoBmp = null;
if (mImageCaptureUri != null) {
  photoBmp = MediaStore.Images.Media.getBitmap(ac.getContentResolver(), mImageCaptureUri);
}

但是Media.getBitmap這個方法獲取已知uri圖片的方式并不可取,咱來看看Media.getBitmap()方法的源碼:

public static final Bitmap getBitmap(ContentResolver cr, Uri url)
    throws FileNotFoundException, IOException {
  InputStream input = cr.openInputStream(url);
  Bitmap bitmap = BitmapFactory.decodeStream(input);
  input.close();
  return bitmap;
}

其實它很簡單很粗暴,返回的是原始大小的bitmap,當(dāng)圖庫選擇的圖片很大時程序極有可能會報OOM。

為了避免OOM,咱們需要改進(jìn)該方法,在 BitmapFactory.decodeStream之前壓縮圖片,以下是我改進(jìn)后的代碼:

在onActivityResult中調(diào)用

Uri mImageCaptureUri = data.getData();
 
Bitmap photoBmp = null;
 
if (mImageCaptureUri != null) {
 
photoBmp = getBitmapFormUri(ac, mImageCaptureUri);
 
}
/**
   * 通過uri獲取圖片并進(jìn)行壓縮
   *
   * @param uri
   */
  public static Bitmap getBitmapFormUri(Activity ac, Uri uri) throws FileNotFoundException, IOException {
    InputStream input = ac.getContentResolver().openInputStream(uri);
    BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
    onlyBoundsOptions.inJustDecodeBounds = true;
    onlyBoundsOptions.inDither = true;//optional
    onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
    BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
    input.close();
    int originalWidth = onlyBoundsOptions.outWidth;
    int originalHeight = onlyBoundsOptions.outHeight;
    if ((originalWidth == -1) || (originalHeight == -1))
      return null;
    //圖片分辨率以480x800為標(biāo)準(zhǔn)
    float hh = 800f;//這里設(shè)置高度為800f
    float ww = 480f;//這里設(shè)置寬度為480f
    //縮放比。由于是固定比例縮放,只用高或者寬其中一個數(shù)據(jù)進(jìn)行計算即可
    int be = 1;//be=1表示不縮放
    if (originalWidth > originalHeight && originalWidth > ww) {//如果寬度大的話根據(jù)寬度固定大小縮放
      be = (int) (originalWidth / ww);
    } else if (originalWidth < originalHeight && originalHeight > hh) {//如果高度高的話根據(jù)寬度固定大小縮放
      be = (int) (originalHeight / hh);
    }
    if (be <= 0)
      be = 1;
    //比例壓縮
    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inSampleSize = be;//設(shè)置縮放比例
    bitmapOptions.inDither = true;//optional
    bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
    input = ac.getContentResolver().openInputStream(uri);
    Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
    input.close();
 
    return compressImage(bitmap);//再進(jìn)行質(zhì)量壓縮
  }
 
/**
  * 質(zhì)量壓縮方法
  *
  * @param image
  * @return
  */
  public static Bitmap compressImage(Bitmap image) {
 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
    int options = 100;
    while (baos.toByteArray().length / 1024 > 100) { //循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮
      baos.reset();//重置baos即清空baos
      //第一個參數(shù) :圖片格式 ,第二個參數(shù): 圖片質(zhì)量,100為最高,0為最差 ,第三個參數(shù):保存壓縮后的數(shù)據(jù)的流
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中
      options -= 10;//每次都減少10
    }
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數(shù)據(jù)生成圖片
    return bitmap;
  }

OOM的問題解決了,但是又碰到另外一個問題,用三星手機拍照或者選擇照片后返回來的圖片居然轉(zhuǎn)了90度。??啾频腶ndroid程序員。。接著改。。

講onActivityResult中的代碼進(jìn)行改進(jìn):

Uri originalUri = null;
   File file = null;
   if (null != data && data.getData() != null) {
     originalUri = data.getData();
     file = getFileFromMediaUri(ac, originalUri);
   }
 Bitmap photoBmp = getBitmapFormUri(ac, Uri.fromFile(file));
 int degree = getBitmapDegree(file.getAbsolutePath());
 /**
  * 把圖片旋轉(zhuǎn)為正的方向
  */
 Bitmap newbitmap = rotateBitmapByDegree(photoBmp, degree);
/**
   * 通過Uri獲取文件
   * @param ac
   * @param uri
   * @return
   */
  public static File getFileFromMediaUri(Context ac, Uri uri) {
    if(uri.getScheme().toString().compareTo("content") == 0){
      ContentResolver cr = ac.getContentResolver();
      Cursor cursor = cr.query(uri, null, null, null, null);// 根據(jù)Uri從數(shù)據(jù)庫中找
      if (cursor != null) {
        cursor.moveToFirst();
        String filePath = cursor.getString(cursor.getColumnIndex("_data"));// 獲取圖片路徑
        cursor.close();
        if (filePath != null) {
          return new File(filePath);
        }
      }
    }else if(uri.getScheme().toString().compareTo("file") == 0){
      return new File(uri.toString().replace("file://",""));
    }
      return null;
    }
/**
   * 讀取圖片的旋轉(zhuǎn)的角度
   *
   * @param path 圖片絕對路徑
   * @return 圖片的旋轉(zhuǎn)角度
   */
  public static int getBitmapDegree(String path) {
    int degree = 0;
    try {
      // 從指定路徑下讀取圖片,并獲取其EXIF信息
      ExifInterface exifInterface = new ExifInterface(path);
      // 獲取圖片的旋轉(zhuǎn)信息
      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;
  }
/**
   * 將圖片按照某個角度進(jìn)行旋轉(zhuǎn)
   *
   * @param bm   需要旋轉(zhuǎn)的圖片
   * @param degree 旋轉(zhuǎn)角度
   * @return 旋轉(zhuǎn)后的圖片
   */
  public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
    Bitmap returnBm = null;
 
    // 根據(jù)旋轉(zhuǎn)角度,生成旋轉(zhuǎn)矩陣
    Matrix matrix = new Matrix();
    matrix.postRotate(degree);
    try {
      // 將原始圖片按照旋轉(zhuǎn)矩陣進(jìn)行旋轉(zhuǎn),并得到新的圖片
      returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
    } catch (OutOfMemoryError e) {
    }
    if (returnBm == null) {
      returnBm = bm;
    }
    if (bm != returnBm) {
      bm.recycle();
    }
    return returnBm;
  }

如有疑問請留言或到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


文章標(biāo)題:詳解android通過uri獲取bitmap圖片并壓縮
轉(zhuǎn)載來于:http://www.xueling.net.cn/article/jihsoe.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 一本大道香蕉久中文在线播放 | 色呦呦视频网站 | 97久久超碰亚洲视觉盛宴 | 亚洲精品尤物av在线观看任我爽 | 日本一卡2卡3卡四卡精品网站 | 久久久综合久久久 | 欧美兽交xxxx×视频 | 色哟哟精品丝袜一区二区 | 日本熟妇人妻中出 | 四虎永久在线精品国产馆v视影院 | 亚洲色大成网站WWW永久在线观看 | 日本久久久久久久久久久久 | 91重口入口处| 一级黄色片中文字幕 | 中文字幕久久波多野结衣AV | 久热免费在线视频 | 九九九九久久久久 | 少妇啪啪免费观看欧美三p 欧洲免费一区二区三区视频 | 亚洲一区视频在线观看视频 | 久久久国产精品无码一区二区 | 亚洲精品国产一区二区三区在线观看 | japanese强行色系 | 无码人妻一区二区三区免费N鬼沢 | 国产无遮挡又黄又爽动态图 | 蜜桃视频一区二区三区在线观看 | 久久久久成人精品无码 | 日本国产高清不卡 | 奇米四色影视 | www.999热 | 91人人澡人人爽人人精品 | 国内午夜国产精品小视频 | 我和隔壁的少妇人妻HD | 久久精品天堂 | 久久久久欧美激情饼干 | 大学生久久香蕉国产线看观看 | 欧美一级视频在线 | 免费在线观看av的网站 | 日本韩国一区二区 | 高清国产下药迷倒白嫩美女99 | 一区二区伦理 | 性一交一乱一色一视频麻豆 |