核心思想:采用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 | public static Bitmap decodeSampledBitmapFromResourse(Resources res |
实际使用
1 | mImageView.setImageBitmap(decodeSampledBitmapFromResouce(getResource(),R.id.iv;100,100)); |
除了BitmapFactory的decodeResource方法,其它三个decode系列的方法也是支持采样加载的,处理方法类似,不过decodeStream方法稍微有点特殊。