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

當咱們在Android使用bitmap加載圖片過程當中,它會將整張圖片全部像素都存在內存中,因爲Android對圖片內存使用的限制,很容易出現OOM(Out of Memory)問題。html

爲了不此類問題咱們能夠採用BitmapFactory.Options或是使用第三方的圖片加載庫。如FrescoPicasso等。java

BitmapFactory.Options

讀取圖片尺寸、類型

如文檔所示:android

若是BitmapFactory.OptionsinJustDecodeBounds 字段設置爲truegit

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

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

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;

圖片顯示

圖片的顯示能夠選擇縮略圖的形式減小內存佔用。htm

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 模塊和特性圖片

相關文章
相關標籤/搜索