android-图片压缩技术及压缩库

本文探讨了Android中图片压缩的几种方法,包括质量压缩、采样率压缩、尺寸压缩和改变压缩格式。质量压缩不改变内存占用,但减小磁盘空间;采样率压缩降低分辨率以减小内存和磁盘空间;尺寸压缩调整图片大小;改变格式压缩通过调整像素大小减少空间。此外,还介绍了两个常用的图片压缩库luban和Compressor。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的图片压缩格式
[外链图片转存失败(img-D9aKMYoo-1564112293136)(evernotecid://F7E95909-F63A-4588-A285-C36400849F9D/appyinxiangcom/16715552/ENResource/p1411)]

ARGB分表表示透明度、红色、绿色、蓝色
ARGB_8888 则表示每个占8位,一个像素就是4个字节

改变压缩格式压缩其本质是改变单个像素大小

实现
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);

图片压缩库

luban

luban github

Compressor

compressor github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值