中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

特克斯县| 积石山| 汉川市| 嘉兴市| 禄丰县| 平利县| 平武县| 屏山县| 赣州市| 彩票| 全州县| 曲靖市| 邻水| 土默特左旗| 文水县| 吕梁市| 江达县| 封丘县| 仪陇县| 新营市| 昆明市| 沙坪坝区| 井冈山市| 布尔津县| 沙田区| 安岳县| 滦平县| 翁牛特旗| 固始县| 沙洋县| 哈尔滨市| 靖远县| 满洲里市| 乌拉特后旗| 屏边| 水富县| 吉林省| 黔东| 保康县| 新营市| 南宁市|