1.加载Bitmap
首先说一下如何加载一个Bitmap,BitmapFactory提供四类方法:decodeFile、decodeResourse、decodeStream和decodeByteArray,分别是从文件系统、资源、输入流以及字节数组中加载出一个对象。
2.BitmapFactory.Options
我们可以通过BitmapFactory.Options可以缩放图片,主要用到了inSampleSize这个参数,即采样率。
当inSampleSize为1时,采样后的图片为原始大小;当inSampleSize为2时,采样后的图片宽度和高度都为原始的1/2,则图片大小就为原始得1/4,像素数也为原始的1/4,所占内存也为原始的1/4。inSampleSize必须大于1图片采用缩小的效果,并且缩小后的图片大小(像素数、所占内存)会是原始的1/(inSampleSize的2次方)。
3.高效加载Bitmap
高效加载Bitmap的思想是:先解析图片,获取宽度和高度。如果用ImageView来显示图片的话,很多时候ImageView没有要加载图片那么大,很容易报错:java.lang.OutofMemoryError:bitmap size exceeds VM budget。那我们通过BitmapFactory.Options按一定采样率来缩小图片,然后再加载给ImageView避免内存不够的错误。
那么,这就需要用到我们刚刚提到的BitmapFactory.Options。然而,图片缩小的实际情况并没有那么理想,比如,ImageView的大小是150*150像素,而图片的原始大小为402*300,那么采用采样率为2,则缩小的图片为201*150,而采用采用率为3,则缩小的图片为134*100。我们就用采样率为2的,因为用采样率为3的,会使图片被拉伸从而导致模糊。
利用采用率高效加载图片的方法如下:
(1)将BitmapFactory.Options的inJustDecodeBounds参数设为true并用前面提到四类方法之一加载图片。
(2)从BitmapFactory.Options中取出图片的原始宽度和高度,对应于Options里面的成员变量outWidth和outHeight。
(3)根据之前提到的规则计算所需要的采样率inSampleSize.
(4)将BitmapFactory.Options的inJustDecodeBounds参数设为false并用前面提到四类方法之一重新加载图片。
4.示例代码
public Bitmap decodeBitmapFromResource(Resource res, int resId,int requestWidth,int requestHeight)
{
final BitmapFactory.Options options = new BitmapFactory.Options();
options.isJustDecodeBounds = true;
BitmapFactory.decodeResource(res,resId,options);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res,resId,options);
}
public int computeInSampleSize(BitmapFactory.Options options, int requestWidth, int requestHeight)
{
int height = options.outHeight;
int width = options.outWidth;
int inSampleSize = 1;
while( (height/inSampleSize) > requestHeight || (width/ inSampleSize)> requestWidth )
{
inSampleSize *= 2;
}
return inSampleSize /= 2;
}
这就是高效加载图片的方法了。