Bitmap如何高效加载图片

时间:2021-03-24 22:40:59

如何高效加载Bitmap?

    核心思想:利用BitmapFactory.Obtions来加载所需尺寸的图片。

BitmapFactory.Obtions主要用到它的inSampleSize参数(采样率)来放缩图片,从而降低内存,提高了Bitmap加载时的效率。

Bitmap怎么加载图片相信大家都很熟了,BitmapFactory提供了四个方法:decodeFiledecodeResourcedecodeStreamdecodeByteArray

 

可能大家对采样率这个概念不是很清楚,在这举个例子:

inSampleSize(采样率)为1时,采样后的图片大小为原图大小;当inSampleSize(采样率)大于1时,比如说2,那么采样后的图片宽和高均为原图大小的1/2,像素为原图的1/4,内存大小也就是原图的1/4。有一种特殊情况,当inSampleSize(采样率)小于1时,其作用相当于1,即无缩放效果。

 

如何获取采样率并加载图片呢?

/**
* 获取采样率
*/

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;
}

}
   有了该方法,使用的时候就很简单了,比如ImageView所期望的图片大小为100 * 100,就可以通过:

mImageView.setImageBitmap(

InSampleSizeUtils.getInSimpleSizeFromeResource(getResource(),R.id.imageview,100,100)

)

来对图片进行高效加载并显示了!