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的图片格式,来达到压缩的效果,其实压缩最主要就是要么改变其宽高,要么就通过减少其单个像素占用的内存。
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是无损压缩。
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.
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; }
放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样。
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将节省一半的内存开销。
private void compressscalebitmap() { bitmap bm = bitmapfactory.decoderesource(getresources(), r.drawable.test); msrcbitmap = bitmap.createscaledbitmap(bm, 600, 900, true); bm = null; }
将图片的大小压缩成用户的期望大小,来减少占用内存。
以上5种就是我们常用的压缩方法了,这里的压缩也只是针对在运行加载的bitmap占用内存的大小。我们在做app内存优化的时候,一般可以从这两个方面入手,一个内存泄漏,另外一个是bitmap压缩了,在要求像素不高的情况下,可以对bitmap进行压缩,并且针对一些只使用一次的bitmap,要做好recycle的处理。
如对本文有疑问, 点击进行留言回复!!
Android studio开发小型对话机器人app(实例代码)
Android通过Java sdk的方式接入OpenCv的方法
Android 通过cmake的方式接入opencv的方法步骤
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
网友评论