国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Bitmap壓縮方式分析

2019-12-12 02:28:06
字體:
來源:轉載
供稿:網友

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上造成內存消耗過大。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乐市| 黔西| 长治市| 梨树县| 佳木斯市| 丰顺县| 鹤庆县| 察隅县| 呼伦贝尔市| 福州市| 凤庆县| 宜良县| 隆子县| 巴里| 兴安县| 阿图什市| 靖州| 应用必备| 安龙县| 德化县| 嘉义县| 呈贡县| 承德县| 泰来县| 平定县| 盘山县| 岳阳县| 澳门| 中超| 红河县| 微博| 扶风县| 吐鲁番市| 酉阳| 姚安县| 灵武市| 来安县| 大埔县| 内江市| 库车县| 三亚市|