Android性能优化之:加载Bitmap优化

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


BitmapFactory的其他三个方法也类似这么写。

这就是高效加载图片的方法了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值