Bitmap源码分析以及图片压缩实现方案
Android中图片是以Bitmap形式存在,Bitmap所占内存大小的计算方式为:图片长度图片宽度一个像素点占用的字节数。为了更好的理解Bitmap,我们先来看下BitmapFactory
Config | 占用字节大小(byte) | 说明 |
---|---|---|
ALPHA_8 (1) | 1 | 代表8位Alpha位图(没有存储任何的色彩信息,每一个像素只需要1byte存储) |
RGB_565 (3) | 2 | 代表16位RGB位图,不存储Alpha值,只用2bytes存储RGB信息,其中R为5bit,G为6bit,而B为5bit |
ARGB_4444 (4) | 4 | 代表16位ARGB位图,质量太差,Android不建议使用,建议使用ARGB_8888 |
ARGB_8888 (5) | 4 | 代表32位ARGB位图,并且可以提供最好质量的图片显示,A,R,G.B各占8bit |
RGBA_F16 (6) | 8 | Android 8.0 新增(更丰富的色彩表现HDR) |
HARDWARE (7) | 该模式表示硬件位图如果,对该内容感兴趣,可以查看这个链接(https://muyangmin.github.io/glide-docs-cn/doc/hardwarebitmaps.html) |
接下来,我将以华为Mate10来进行图片压缩测试,首先从SD卡读取一张照片
Bitmap bitmap = BitmapFactory.decodeFile(getExternalCacheDir() + "/123.jpg");
ivPic.setImageBitmap(bitmap);
Log.e(TAG, "-------->压缩前" + (bitmap.getByteCount() / 1024 / 1024) + "M" + "图片宽高为------>" + bitmap.getWidth() + "------->" + bitmap.getHeight());
Log输出的结果为:
MainActivity: -------->压缩前45M图片宽高为------>2976------->3968
接下来我将分别介绍下各个压缩方式
1.质量压缩
private void qualityZip() {
Bitmap bitmap = BitmapFactory.decodeFile(getExternalCacheDir() + "/123.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality