當咱們在Android
使用bitmap
加載圖片過程當中,它會將整張圖片全部像素都存在內存中,因爲Android
對圖片內存使用的限制,很容易出現OOM(Out of Memory)
問題。html
爲了不此類問題咱們能夠採用BitmapFactory.Options或是使用第三方的圖片加載庫。如Fresco、Picasso等。java
如文檔所示:android
若是BitmapFactory.Options
中inJustDecodeBounds
字段設置爲true
git
If set to true, the decoder will return null (no bitmap), but the out...github
decodeByteArray(), decodeFile(), decodeResource()
等解析bitmap
方法並不會真的返回一個bitmap
而是僅僅將圖片的寬、高、圖片類型參數返回給你,這樣就不會佔用太多內存,避免OOM
code
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; }