1. 程式人生 > >Bitmap的高效載入

Bitmap的高效載入

核心思想:採用BitmapFactory.Options來載入所需尺寸的照片

這裡假設通過ImagView來顯示圖片,很多時候ImageView並 沒有圖片的原始尺寸大,故這時候顯然沒並要把整個圖片載入進來。通過BitmapFactory.Options就可以按一定的取樣率來載入縮小的圖片,進而在ImageView中顯示,這樣就會降低記憶體佔用從而在一定程度上避免OOM,提高Bitmap載入時的效能。

通過Options來縮放圖片,主要用到它的inSampleSize引數,即取樣率。

當inSampleSize為1時,表示取樣圖片大小為圖片的原始大小;2表示取樣圖片的寬/高為原圖的1/2,故像畫素為原圖的1/4,記憶體大小也為原圖的1/4。需注意當inSampleSize小於1時,其作用相當於1,即無縮放效果。

獲取取樣率的流程:

1. 將BitmapFactory.Options的inJustDecodeBounds引數設為true並載入圖片。
2. 從BitmapFactory.Options中取出圖片的原始寬高資訊,它們對應outWidth和outHeight引數
3. 根據取樣率的規則並結合目標View的所需大小計算出取樣率inSampleSize.
4. 將BitmapFactory.Options的inJustDecodeBounds的引數設為false,然後重新載入圖片。

這裡需要說明一下inJustDecodeBounds引數,設定為true時,BitmapFactory只會解析圖片的寬高資訊,並不會真正載入圖片,故這操作為輕量級的。

public static Bitmap decodeSampledBitmapFromResourse(Resources res
            int resId,int reqWidth,int reqHeight ){
    final BitmapFactory.Options options=new BitmapFactotry.Options();
    options.inJustDecodeBounds=true;
    BitmapFactory.decodeResource(res,resId,options);
    //計算取樣率
    options.
inSampleSize=calculateInsampleSize(options,reqwidth,reqHeight); options.inJustDecodeBounds=fales; return BitmapFactory.decodeResource(res,resId,options); } public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,reqHeight){ final int height = options.outHeight; final int width = Options.outWidth; int inSampleSize = 1if(height > reqHeight || width > reqWidth){ final int halfHeight = height / 2; final int halfWidth = width / 2; while((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize >= reqWidth)){ inSampleSize *= 2; } } return inSampleSize; }

實際使用

mImageView.setImageBitmap(decodeSampledBitmapFromResouce(getResource(),R.id.iv;100,100));

除了BitmapFactory的decodeResource方法,其它三個decode系列的方法也是支援取樣載入的,處理方法類似,不過decodeStream方法稍微有點特殊。

注:本筆記來源於《Android開發藝術探索》相關知識