bitmap所占内存大小计算方式:
图片长度
×
\times
×图片宽度
×
\times
×一个像素点所占用的字节数
图片所占磁盘空间大小:
分辨率
×
\times
×位深 / 8
图片压缩的原理就是针对以上三个参数进行改变,只要他们其一发生改变,图片大小就会变化
质量压缩
质量压缩不会改变图片在内存中的大小,但是可以减小图片所占用的磁盘空间大小。
问:为什么内存小而磁盘空间不变?
答:质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的。既然宽度高度和像素都没变化,那么自然内存大小不会改变。图片在磁盘中的大小计算公式为:大小=分辨率 × \times ×位深 / 8,因为质量压缩改变位深,因此磁盘大小就会改变
实现方式
调用Bitmap的compress方法
public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream)
- format是图片压缩后的格式 Bitmap.CompressFormat .JPEG、.PNG、.WEBP。
- quality 取值0-100 值越小,图片越失真
- stream指定压缩图片输出的地方
注意⚠️:质量压缩对PNG格式的图片无效,PNG是无损压缩,无法设置quality
采样率压缩
采样率压缩是通过减小图片的分辨率来达到压缩的目的。
使用采样率压缩会同时减少内存占用空间和磁盘空间。
实现方式
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
其中insamplesize就是采样率,图片的分辨率会/inSampleSize。
如果inSampleSIze为2那么压缩后图片尺寸为原来的1/2
注意点:
- inSampleSize小于等于1会按照1处理
- inSampleSize只能设置2的平方
尺寸压缩
// 方法一
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),
bit.getHeight(), matrix, true);
// 方法二
bm = Bitmap.createScaledBitmap(bit, 600, 400, true);
改变压缩格式压缩
首先说说android的图片压缩格式
ARGB分表表示透明度、红色、绿色、蓝色
ARGB_8888 则表示每个占8位,一个像素就是4个字节
改变压缩格式压缩其本质是改变单个像素大小
实现
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);