Android 性能優化:Bitmap 優化

1、優化原因
  1. Bitmap 消耗內存,內存佔用過多容易發生 OOM。
2、優化方案

1、使用完釋放圖片資源。
2、根據圖片的質量壓縮。
3、根據圖片的尺寸壓縮。
4、設置圖片緩存。

  1. 使用完釋放圖片資源。
    1.釋放圖片資源 + 軟引用(SoftReference)。
    private Bitmap mBitmap;
    private SoftReference<Bitmap> bitmapSoftReference;
    
    public static void recycleBitmap(Bitmap bitmap) {
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
            bitmap = null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        BitmapUtil.recycleBitmap(mBitmap);
        if(bitmapSoftReference!=null){
            BitmapUtil.recycleBitmap(bitmapSoftReference.get());
        }
    }
  1. 根據圖片的質量壓縮。
    1、質量壓縮比例 = quality / 100。
    // 對圖片質量進行壓縮
    public static Bitmap compressBitmap(Bitmap bitmap) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 質量壓縮方法,這裏100表示不壓縮,把壓縮後的數據存放到 os 中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
        int quality = 100;
        // 循環判斷如果壓縮後圖片是否大於0.5M,大於繼續壓縮
        while (os.toByteArray().length > 1024 * 512) {
            // 清空os
            os.reset();
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, os);
            // 每次都減少10
            quality -= 10;
        }
        // 把壓縮後的數據os存放到ByteArrayInputStream 中
        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
        // 把 ByteArrayInputStream 數據生成圖片
        Bitmap newBitmap = BitmapFactory.decodeStream(is, null, null);
        return newBitmap;
    }
  1. 根據圖片的尺寸壓縮。
    1、設置解碼方式(inPreferredConfig ):ARGB_8888(默認)、ARGB_4444、ARGB_565、ALPHA_8。
    2、設置圖片縮放比例:縮放比例 = 1 / inSampleSize(inSampleSize<1?1:inSampleSize)。
    // 對圖片尺寸進行壓縮
    public static Bitmap compressBitmap(Bitmap bitmap,int width,int height){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 質量壓縮方法,這裏100表示不壓縮,把壓縮後的數據存放到 os 中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);

        // 把壓縮後的數據os存放到 ByteArrayInputStream 中
        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        // 解碼方式
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        BitmapFactory.decodeStream(is, null, options);
        // 縮放比例
        int inSampleSize = calculateInSampleSize(options, width, height);
        options.inSampleSize = inSampleSize;
        options.inJustDecodeBounds = false;

        is = new ByteArrayInputStream(os.toByteArray());
        Bitmap newBitmap = BitmapFactory.decodeStream(is, null, options);
        return newBitmap;
    }

    public static int calculateInSampleSize(BitmapFactory.Options var0, int var1, int var2) {
        int var3 = var0.outHeight;
        int var4 = var0.outWidth;
        int var5 = 1;
        if (var3 > var2 || var4 > var1) {
            int var6 = Math.round((float) var3 / (float) var2);
            int var7 = Math.round((float) var4 / (float) var1);
            var5 = var6 > var7 ? var6 : var7;
        }

        return var5;
    }
  1. 設置圖片緩存。
    1、優化原因:重複加載圖片消耗資源(CPU、內存、流量)。
    2、優化方案:1、三級緩存:內存緩存->本地緩存(數據庫、文件)->網絡緩存。2、軟引用(SoftReference,內存不足回收對象)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章