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只会解析图片的宽高信息,并不会真正加载图片,故这操作为轻量级的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}

实际使用

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

除了BitmapFactory的decodeResource方法,其它三个decode系列的方法也是支持采样加载的,处理方法类似,不过decodeStream方法稍微有点特殊。

-------------本文结束感谢您的阅读-------------