android之bitmap压缩

概要

android中的图片是以bitmap的形式存在,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小的计算公式:

图片长度 x 图片宽度 x 一个像素点占用的字节数

以下是图片的压缩格式:

质量压缩

1
2
3
4
5
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = Integer.valueOf(editText.getText().toString());
bit.compress(CompressFormat.JPEG, quality, baos);
byte[] bytes = baos.toByteArray();
bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

质量压缩后图片的大小是没有变的,因为它不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,所以最后bitmap所占内存大小是不会变的。但是bytes.length是随着quality变小而变小的,这样适合去传递二进制的图片数据。

采样率压缩

1
2
3
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "test.jpg", options);

设置inSampleSize的值后,假设inSampleSize = 2,则宽和高都为原来的1 / 2,宽高都减少了,自然内存也降低了。

缩放法压缩(matrix)

1
2
3
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(), bit.getHeight(), matrix, true);

使用matrix也是对图片的长度和宽度进行压缩。

RGB_565法

1
2
3
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "test.jpg", options2);

这种方法可以把图片大小直接缩小了一半,长度和宽度没有变化,相比ARGB_8888减少了一半的内存,本质上是改变编码像素的字节数来压缩的。

createScaledBitmap

1
bm = Bitmap.createScaledBitmap(bit, 150, 150, true);

这里是将图片压缩成用户所期望的长度和宽度,但是如果用户期望的长度和宽度与原图长度宽度相差太多的话,图片会很不清晰。

总结

Bitmap压缩都是围绕这个来做文章:Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。3个参数,任意减少一个的值,就达到了压缩的效果。