这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
前言
了解# Bitmap图片加载之后就不得不提到图片压缩了。图片压缩在应用中必不可少,有效压缩图片降低应用内存占用事半功倍。但图片压缩需要有策略条件,怎么压缩图片能够保证既能降低内存占用又能让图片展示保持清晰不失真。
内存占用
开始之前需要知道一张图片加载时到底要占用多大内存。可能在图片显示简介中可以查看到图片文件大小在几百KB,但真正在应用中使用时会发现内存占用大小并不等于图片文件大小。这其实是一个误区,图片文件大小只能代表图片存储大小并不能表示图片加载大小, 图片存储也由储存算法将图片信息进行优化处理减小储存空间。这里只需要知道图片加载占用内存大小和图片尺寸+图片一个像素大小所决定。
压缩
知道图片占用内存大小与图片尺寸宽高和像素相关之后,就可以通过修改图片尺寸大小或是像素占用大小来降低图片加载内存。
像素占用
Bitmap.Config提供了几种常用的图片格式,可根据需要加载不同格式图片。一般情况都选用ARGB_8888但像素比较大,若不考虑图片的透明度展示可采用RGB_565,像素占用会减少一半。
- ALPHA_8:每个像素占用1byte内存,只有透明通道。
- ARGB_4444:每个像素占用2byte内存,16位
- ARGB_8888:每个像素占用4byte内存,32位
- RGBA_F16:每个像素占用8byte内存,64位
- RGB_565:每个像素占用2byte内存,16位,没有透明通道。
RGB565压缩
BitmapFactory.Options中inPreferredConfig配置为Bitmap.Config.RGB_565能有效降低图片内存占用。
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.jay,options2);
质量压缩
通过Bitmap的compress方法降低图片质量不降低图片尺寸。可以明显看出图片显示质量上有一定程度损失,但图片占用大小没用变化。质量压缩并不会改变图片的像素,而是改变图片位深和透明度。既然没有改变图片内存占用那使用质量压缩用途是什么。图片质量压缩常常用在二进制图片数据传递中,减少byte数据量方便数据更快传递。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 20, bos);
byte[] bytes = bos.toByteArray();
Bitmap mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
采样率、缩放压缩
通过BitmapFactory.Options的inSampleSize减半采样实现压缩。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.jay,options);
通过Matrix缩小Bitmap尺寸实现压缩。
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
mSrcBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Bitmap提供createScaledBitmap方法缩小Bitmap尺寸实现压缩。
Bitmap bitmap3 = Bitmap.createScaledBitmap(bitmap,bitmap.getWidth()/ 2,bitmap.getHeight() / 2,true);
综上所述方法基本上以降低缩小图片尺寸大小来实现图片压缩降低图片内存占用。
总结
图片压缩策略核心点就是:降低图片宽高比、降低像素占用大小。只要围绕这两点就能基本完成图片压缩功能,但这还只是简单的图片压缩策略形式。其实还有通过裁剪方式减少图片内存占用:例如居中展示上只加载图片展示部分的数据,也就是非原图完整尺寸展示;又或是特殊有损图片格式优化,比如webp格式图片等。归根结底图片压缩在应用开发中的意义其实就是降低内存占用,合理使用内存及时回收无用资源才是根本。