1. 程式人生 > >Android BitmapFactory.Options 解決大圖片加載OOM問題

Android BitmapFactory.Options 解決大圖片加載OOM問題

evel 寬高 lock github 取圖 math 使用 最終 過程

當我們在Android使用bitmap加載圖片過程中,它會將整張圖片所有像素都存在內存中,由於Android對圖片內存使用的限制,很容易出現OOM(Out of Memory)問題。

為了避免此類問題我們可以采用BitmapFactory.Options或是使用第三方的圖片加載庫。如Fresco、Picasso等。

BitmapFactory.Options

讀取圖片尺寸、類型

如文檔所示:

如果BitmapFactory.OptionsinJustDecodeBounds 字段設置為true

If set to true, the decoder will return null (no bitmap), but the out...

decodeByteArray(), decodeFile(), decodeResource()等解析bitmap方法並不會真的返回一個bitmap 而是僅僅將圖片的寬、高、圖片類型參數返回給你,這樣就不會占用太多內存,避免OOM

itmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

圖片顯示

圖片的顯示可以選擇縮略圖的形式減少內存占用。



public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // 原始圖片尺寸
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
                // 計算出實際寬高和目標寬高的比率
                final int heightRatio = Math.round((float) height / (float) reqHeight);
                final int widthRatio = Math.round((float) width / (float) reqWidth);
                // 選擇寬和高比率中最小的作為inSampleSize的值,這樣可以保證最終生成圖片的寬和高
                // 一定都會大於等於目標的寬和高。
                inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
            }

    return inSampleSize;
}

Fresco

Fresco 模塊和特性

Android BitmapFactory.Options 解決大圖片加載OOM問題