如何高效加载Bitmap?
核心思想:利用BitmapFactory.Obtions来加载所需尺寸的图片。
BitmapFactory.Obtions主要用到它的inSampleSize参数(采样率)来放缩图片,从而降低内存,提高了Bitmap加载时的效率。
(Bitmap怎么加载图片相信大家都很熟了,BitmapFactory提供了四个方法:decodeFile、decodeResource、decodeStream、decodeByteArray)
可能大家对采样率这个概念不是很清楚,在这举个例子:
当inSampleSize(采样率)为1时,采样后的图片大小为原图大小;当inSampleSize(采样率)大于1时,比如说2,那么采样后的图片宽和高均为原图大小的1/2,像素为原图的1/4,内存大小也就是原图的1/4。有一种特殊情况,当inSampleSize(采样率)小于1时,其作用相当于1,即无缩放效果。
如何获取采样率并加载图片呢?
/**有了该方法,使用的时候就很简单了,比如ImageView所期望的图片大小为100 * 100,就可以通过:
* 获取采样率
*/
public class InSampleSizeUtils {
public static Bitmap getInSampleSizeFromeResource(Resources res, int resId, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
/**
* 如果该值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。
* 但是允许我们查询图片的信息这其中就包括图片大小信
* (options.outHeight (图片原始高度)和option.outWidth(图片原始宽度))。
*/
options.inJustDecodeBounds = true; //仅仅为了获取图片尺寸信息
BitmapFactory.decodeResource(res, resId, options);
//计算采样率
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqWidth);
// 注意:这次要把options.inJustDecodeBounds 设为 false,这次图片是要读取出来的。
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
//获取图片的高和宽
final int height = options.outHeight;
final int width = options.outWidth;
//初始化InSamplSize
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
/**
* 计算出最大的inSampleSize值,同时官方最新的文档指出:inSampleSize取值应该为2的指数
*/
//图片的高和宽大于要求的高和宽
while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
}
mImageView.setImageBitmap(
InSampleSizeUtils.getInSimpleSizeFromeResource(getResource(),R.id.imageview,100,100)
)
来对图片进行高效加载并显示了!