已经很久没有更新博客,大概有半年了,主要是博主这段时间忙于找工做,Android岗位的工做真的是愈来愈难找,好不容易在广州找到一家,主要作海外产品,公司研发实力也不错,因此就敲定了三方协议。如今已经在公司实习了一个月多,目前主要是负责公司某个产品的内存优化,恰好就总结了一下Android Bitmap经常使用的优化方式。git
Android中的图片是以Bitmap方式存在的,绘制的时候也是Bitmap,直接影响到app运行时的内存,在Android,Bitmap所占用的内存计算公式是:图片长度 x 图片宽度 x像素点的字节数github
Enum Values | |
---|---|
ALPHA_8 | 每一个像素都存储为一个半透明(alpha)通道 |
ARGB_4444 | 此字段已在API级别13中弃用。因为此配置的质量较差,建议使用ARGB_8888 |
ARGB_8888 | 每一个像素存储在4个字节。 |
RGB_565 | 每一个像素存储在2个字节中,只有RGB通道被编码:红色以5位精度存储(32个可能值),绿色以6位精度存储(64个可能值),蓝色存储为5位精确。 |
其中字母表明的意思咱们大概均可以理解,接下来咱们来算算它们单个像素点的字节数:bash
咱们在作压缩处理的时候,能够先经过改变Bitmap的图片格式,来达到压缩的效果,其实压缩最主要就是要么改变其宽高,要么就经过减小其单个像素占用的内存。app
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.spa
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;
}
复制代码
放缩法压缩使用的是经过矩阵对图片进行裁剪,也是经过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理同样。code
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将节省一半的内存开销。orm
private void compressScaleBitmap() {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
bm = null;
}
复制代码
将图片的大小压缩成用户的指望大小,来减小占用内存。cdn
以上5种就是咱们经常使用的压缩方法了,这里的压缩也只是针对在运行加载的bitmap占用内存的大小。咱们在作App内存优化的时候,通常能够从这两个方面入手,一个内存泄漏,另一个是Bitmap压缩了,在要求像素不高的状况下,能够对Bitmap进行压缩,而且针对一些只使用一次的bitmap,要作好recycle的处理。
博客就写到这里,如下是源码地址。 ·