Bitmap的高效加载

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/qq_41979349/article/details/84036739

核心思想:采用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只会解析图片的宽高信息,并不会真正加载图片,故这操作为轻量级的。

public static Bitmap decodeSampledBitmapFromResourse(Resources res
            int resId,int reqWidth,int reqHeight ){
    final BitmapFactory.Options options=new BitmapFactotry.Options();
    options.inJustDecodeBounds=true;
    BitmapFactory.decodeResource(res,resId,options);
    //计算采样率
    options.inSampleSize=calculateInsampleSize(options,reqwidth,reqHeight);
    
    options.inJustDecodeBounds=fales;
    return BitmapFactory.decodeResource(res,resId,options);
    
    
}    
    public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,reqHeight){
        final int height = options.outHeight;
        final int width = Options.outWidth;
        int inSampleSize = 1if(height > reqHeight || width > reqWidth){
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            
            while((halfHeight / inSampleSize) >= reqHeight
            && (halfWidth / inSampleSize >= reqWidth)){
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

实际使用

mImageView.setImageBitmap(decodeSampledBitmapFromResouce(getResource(),R.id.iv;100,100));

除了BitmapFactory的decodeResource方法,其它三个decode系列的方法也是支持采样加载的,处理方法类似,不过decodeStream方法稍微有点特殊。

注:本笔记来源于《Android开发艺术探索》相关知识

猜你喜欢

转载自blog.csdn.net/qq_41979349/article/details/84036739
今日推荐