Bitmap的高效載入
阿新 • • 發佈:2018-11-14
核心思想:採用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 = 1;
if(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方法稍微有點特殊。