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

首頁 > 系統 > Android > 正文

Android Bitmap壓縮方式分析

2019-10-22 18:32:12
字體:
來源:轉載
供稿:網友

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

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙田区| 海林市| 固阳县| 景宁| 新邵县| 泰安市| 柳河县| 渝北区| 柘荣县| 余庆县| 鄂托克前旗| 麦盖提县| 连城县| 兴业县| 西充县| 象州县| 凌源市| 密山市| 文水县| 介休市| 武功县| 乡城县| 崇义县| 黄骅市| 灵川县| 麦盖提县| 双城市| 贺州市| 惠州市| 宝鸡市| 泊头市| 石阡县| 凤台县| 枣庄市| 安义县| 绥宁县| 都昌县| 会东县| 辽源市| 错那县| 嘉峪关市|