图片压缩处理之Bitmap操作

最近在看有关于LruCache和DiskLruCache的原理实现,由此延伸出了如何计算一个Bitmap所占内存的大小以及图片压缩处理的操作.

有关于LruCache和DiskLruCache的原理解析,我推荐这位大佬的一篇博文,文章末尾也说明了如何计算一个Bitmap所占用内存的大小.推荐链接https://juejin.im/post/5a6da6e7f265da3e303cbcb6

最后我们来唠叨一下图片压缩.我们都知道手机内存空间有限,手机对内存的管理又相当的苛刻,在手机app中图片又是一个内存占用的大户,所以在很多场景下我们不得不慎重加载图片资源.操作不当的话,很容易引起oom.废话不多说,接下来捋一遍压缩的具体流程.

图片压缩处理,我们会用到BitmapFactory.Options,通过查看源码我们发现Options是BitmapFactory的一个内部静态管理类,Options中有一些关于图片处理的相关参数.常用到的比如inJustDecodeBounds,inSampleSize.inJustDecodeBounds设置为true表示只获取加载图片相关的规格参数(width,height等),手机不会为图片开辟内存空间.反之,需要开辟内存空间.inSampleSize没啥好说的,就是压缩的规格参数(需要注意:inSampleSize=2时,压缩之后为原来的四分之一.3时为原来大小的九分之一.以此类推).最后上代码.

大家有必要先去看一下BitmapFactory.Options相关源码

图片压缩代码
     /**
     * @deprecated 图片压缩处理
     * */
    public Bitmap decodeFile(File file) throws FileNotFoundException {
        BitmapFactory.Options options = new BitmapFactory.Options();
        //1 这里我们只需要获取图片的一些基本参数,不需要为Biamap开辟物理内存,所以设置 
        inJustDecodeBounds=true
        options.inJustDecodeBounds=true;
        //2 解码
        BitmapFactory.decodeStream(new FileInputStream(file),null,options);
        //3 压缩 这里根据自己的需求设置压缩的规格参数
        final int COMPRESS_VALUE = 70;
        int width = options.outWidth;
        int height = options.outHeight;
        int SCALE_VALUE = 1;
        while (true){
            if(width/2 < COMPRESS_VALUE || height/2 < COMPRESS_VALUE){
                break;
            }
            width /= 2;
            height /= 2;
            SCALE_VALUE *= 2;
        }
        //4 创建一个新的options容器,设置inSampleSize缩放值
        BitmapFactory.Options optionsNew = new BitmapFactory.Options();
        optionsNew.inSampleSize = SCALE_VALUE;
        //5 最后返回bitmap
        return BitmapFactory.decodeStream(new FileInputStream(file),null,optionsNew);
    }
最后需要说明的是,LruCache和DiskLruCache还是非常有必要研究一下的,我们常用的Okhttp,Glide,Fresco等还有后端的redis等内部缓存都有用到,所以推荐必看,必须研究透透的.就写到这里吧.写的不好的地方希望指正.
发布了13 篇原创文章 · 获赞 11 · 访问量 9237

猜你喜欢

转载自blog.csdn.net/wangzizhong201205/article/details/93195327
今日推荐