当前位置: 移动技术网 > IT编程>移动开发>Android > Android Bitmap的常用压缩方式

Android Bitmap的常用压缩方式

2018年09月18日  | 移动技术网IT编程  | 我要评论

一、前言

android中的图片是以bitmap方式存在的,绘制的时候也是bitmap,直接影响到app运行时的内存,在android,bitmap所占用的内存计算公式是:图片长度 x 图片宽度 x像素点的字节数

二、图片常用的压缩格式

enum values  
alpha_8 每个像素都存储为一个半透明(alpha)通道
argb_4444 此字段已在api级别13中弃用。由于此配置的质量较差,建议使用argb_8888
argb_8888 每个像素存储在4个字节。
rgb_565 每个像素存储在2个字节中,只有rgb通道被编码:红色以5位精度存储(32个可能值),绿色以6位精度存储(64个可能值),蓝色存储为5位精确。

其中字母代表的意思我们大概都可以理解,接下来我们来算算它们单个像素点的字节数:
- alpha_8:表示8位alpha位图,即透明度占8个位,一个像素点占用1个字节,它没有颜色,只有透明度。
- argb_4444:表示16位argb位图,即a=4,r=4,g=4,b=4,一个像素点占4+4+4+4=16位,2个字节。
- argb_8888:表示32位argb位图,即a=8,r=8,g=8,b=8,一个像素点占8+8+8+8=32位,4个字节。
- rgb_565 :表示16位rgb位图,即r=5,g=6,b=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

我们在做压缩处理的时候,可以先通过改变bitmap的图片格式,来达到压缩的效果,其实压缩最主要就是要么改变其宽高,要么就通过减少其单个像素占用的内存。

三、常用的压缩方法:

1.质量压缩

    private void compressquality() {
        bitmap bm = bitmapfactory.decoderesource(getresources(), r.drawable.test);
        msrcsize = bm.getbytecount() + "byte";
        bytearrayoutputstream bos = new bytearrayoutputstream();
        bm.compress(bitmap.compressformat.jpeg, 100, bos);
        byte[] bytes = bos.tobytearray();
        msrcbitmap = bitmapfactory.decodebytearray(bytes, 0, bytes.length);
    }

质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,那么bitmap所占内存大小是不会变的。

我们可以看到有个参数:quality,可以调节你压缩的比例,但是还要注意一点就是,质量压缩堆png格式这种图片没有作用,因为png是无损压缩。

2.采样率压缩

    private void compresssampling() {
        bitmapfactory.options options = new bitmapfactory.options();
        options.insamplesize = 2;
        msrcbitmap = bitmapfactory.decoderesource(getresources(), r.drawable.test, options);
    }

采样率压缩其原理其实也是缩放bitamp的尺寸,通过调节其insamplesize参数,比如调节为2,宽高会为原来的1/2,内存变回原来的1/4.

3.放缩法压缩

    private void compressmatrix() {
        matrix matrix = new matrix();
        matrix.setscale(0.5f, 0.5f);
        bitmap bm = bitmapfactory.decoderesource(getresources(), r.drawable.test);
        msrcbitmap = bitmap.createbitmap(bm, 0, 0, bm.getwidth(), bm.getheight(), matrix, true);
        bm = null;
    }

放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样。

4.rgb_565压缩

    private void compressrgb565() {
        bitmapfactory.options options = new bitmapfactory.options();
        options.inpreferredconfig = bitmap.config.rgb_565;
        msrcbitmap = bitmapfactory.decoderesource(getresources(), r.drawable.test, options);
    }

这是通过压缩像素占用的内存来达到压缩的效果,一般不建议使用argb_4444,因为画质实在是辣鸡,如果对透明度没有要求,建议可以改成rgb_565,相比argb_8888将节省一半的内存开销。

5.createscaledbitmap

    private void compressscalebitmap() {
        bitmap bm = bitmapfactory.decoderesource(getresources(), r.drawable.test);
        msrcbitmap = bitmap.createscaledbitmap(bm, 600, 900, true);
        bm = null;
    }

将图片的大小压缩成用户的期望大小,来减少占用内存。

四、效果图

show.gif

五、总结

以上5种就是我们常用的压缩方法了,这里的压缩也只是针对在运行加载的bitmap占用内存的大小。我们在做app内存优化的时候,一般可以从这两个方面入手,一个内存泄漏,另外一个是bitmap压缩了,在要求像素不高的情况下,可以对bitmap进行压缩,并且针对一些只使用一次的bitmap,要做好recycle的处理。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网