Android BitmapFactory.Options 解決大圖片加載OOM問題
阿新 • • 發佈:2018-09-17
evel 寬高 lock github 取圖 math 使用 最終 過程
當我們在Android
使用bitmap
加載圖片過程中,它會將整張圖片所有像素都存在內存中,由於Android
對圖片內存使用的限制,很容易出現OOM(Out of Memory)
問題。
為了避免此類問題我們可以采用BitmapFactory.Options或是使用第三方的圖片加載庫。如Fresco、Picasso等。
BitmapFactory.Options
讀取圖片尺寸、類型
如文檔所示:
如果BitmapFactory.Options
中inJustDecodeBounds
字段設置為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問題