亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Bitmap壓縮方式分析

發布時間:2020-09-03 11:47:31 來源:腳本之家 閱讀:101 作者:左手木亽 欄目:移動開發

Android Bitmap壓縮方式分析

在網上調查了圖片壓縮的方法并實裝后,大致上可以認為有兩類壓縮:質量壓縮(不改變圖片的尺寸)和尺寸壓縮(相當于是像素上的壓縮);質量壓縮一般可用于上傳大圖前的處理,這樣就可以節省一定的流量,畢竟現在的手機拍照都能達到3M左右了,尺寸壓縮一般可用于生成縮略圖。

在Android開發中我們都會遇到在一個100*100的ImageView上顯示一張過大的圖片,如果直接把這張圖片顯示上去對我們應用沒有一點好處反而存在OOM的危險,所以我們有必要采用一種有效壓縮方式來顯示上去。

private void calculateBitmapInSimpleSize() {
    Bitmap _bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage);
    getBitmapDatas(_bitmap);

    BitmapFactory.Options optioins = new BitmapFactory.Options();
    optioins.inJustDecodeBounds = true;
//    optioins.inPreferredConfig = Bitmap.Config.RGB_565;//11158560
    optioins.inPreferredConfig = Bitmap.Config.ARGB_8888;//22317120
    BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
    int reqWidth = optioins.outWidth;
    int reqHeight = optioins.outHeight;

    Log.w(TAG, "reqWidth = " + reqWidth);
    Log.w(TAG, "reqHeight = " + reqHeight);

    int inSampleSize = 1;
    final int widthRatio = Math.round((float)reqWidth / 100f);
    final int heigthRatio = Math.round((float) reqHeight / 100f);
    // 取最小值 這將保證壓縮出來的圖片大于或者等于請求的寬度或者高度
    inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;
    Log.w(TAG, "first inSampleSize = " + inSampleSize);

    final int totalPixel = 100 * 100;
    final int totalReqPixel = reqWidth * reqHeight * 2;

    Log.w(TAG, "totalReqPixel = " + totalReqPixel);

    while (totalPixel / (inSampleSize * inSampleSize) > totalReqPixel) {
      Log.w(TAG, "totalPixel = " + (totalPixel / (inSampleSize * inSampleSize)));
      inSampleSize ++;
    }

    Log.w(TAG, "LastInSampleSize = " + inSampleSize);

    optioins.inJustDecodeBounds = false;

    Bitmap lastBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
    getBitmapDatas(lastBitmap);

    mImageView.setImageBitmap(lastBitmap);

  }

通過打印log我們可以清楚發現一張原始的圖片占有22317120字節,經過壓縮后11158560(RGB_565)/ 22317120(RGB8888)明顯所占用的內存都減少了,盡量降低這種情況帶來的OOM。

做法:

1.optioins.inJustDecodeBounds = true設置為true可用于讀取該bitmap的寬高且不會占用內存。

2.optioins.inPreferredConfig = Bitmap.Config.RGB_565設置在內存中以占用最少的方式,相比RGB_8888只有其一半的內存占有。

3.final int widthRatio = Math.round((float)reqWidth / 100f);
final int heigthRatio = Math.round((float) reqHeight / 100f);
inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;

計算壓縮比例,取最小值 這將保證壓縮出來的圖片大于或者等于請求的寬度或者高度。

4.在要顯示到ImageView的時候optioins.inJustDecodeBounds = false設回false這樣就能正常顯示了

// 計算bitmap所占內存值
 public void getBitmapDatas(Bitmap bitmap) {
     Log.w(TAG, "Bitmap size = " + bitmap.getByteCount());
  }

采用以上的壓縮方式 我們就能避免一張過大的圖片”浪費”的顯示在ImageView上造成內存消耗過大。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中宁县| 永德县| 邹平县| 开原市| 武冈市| 高密市| 宜君县| 清新县| 鹤壁市| 清河县| 子长县| 玉山县| 讷河市| 腾冲县| 磐石市| 阿图什市| 泸西县| 遂昌县| 温泉县| 周宁县| 墨玉县| 岳西县| 镇平县| 巫山县| 聂拉木县| 昆山市| 大丰市| 钦州市| 塔城市| 辛集市| 无锡市| 甘南县| 桃园县| 达州市| 鹤峰县| 微山县| 太谷县| 丰原市| 惠安县| 阳泉市| 中山市|