图片压缩处理之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等内部缓存都有用到,所以推荐必看,必须研究透透的.就写到这里吧.写的不好的地方希望指正.

 

基于Javascript的bitmap处理,并且将位图输出为base64编码以便于浏览器进行显示。   一、Bitmap.create(width, height, bgcolor)     创建一个width x height像素大小的位图,底色为bgcolor所代表的颜色。     如:bitmap.create(10, 10, 0xff0000); // 创建一个10 x 10像素的底色为红色的位图 二、Bitmap.toBase64()     将位图输出为base64编码的带datauri头(data:image/bmp;base64,)的字符串,以便于在浏览器里显示。     如:document.getElementById('img1').src = bitmap.toBase64(); 三、Bitmap.fromBase64()     自图像的BASE64编码中恢复位图数据,目前只支持24位色的BMP位图数据。     如:bitmap.fromBase64('Qk06AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='); 四、Bitmap.setBitmapBytes(val, idx, length)     修改bitmap位图数据的第idx位置起的length字节为val值。 五、Bitmap.getBitmapBytes(idx, length)     获取bitmap位图数据的第idx位置起的length个字节的值,返回值为数组。 六、Bitmap.setHeaderValue(attribute, headerValue)     设置attribute头属性的值为headerValue,attribute必须为BitMapFormat的成员属性,需要提供offset、length等属性值。     如:bitmap.setHeaderValue(BitmapFormat.biWidth, 500); // 设置位图的宽度为500像素值 七、Bitmap.getHeaderValue(attribute)     获取位图attribute头属性的值,attribute必须为BitmapFormat的成员属性,需要提供offset、length等属性值,返回的是经过Endian转换后的实际整数值。 八、Bitmap.setPixel(x, y, color)     设置位图的(x, y)位置的像素值为color。 九、Bitmap.getPixel(x, y)     获取位图的(x, y)位置的RGB值,返回的内容为[ rr, gg, bb ]的数组内容 标签:jsBitmap
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值