几种常见的压缩方式
1.质量压缩
bitmap.compress(Bitmap.CompressFormat.JPEG,50,outputStream)
或降低采样率
val options = BitmapFactory.Options()
options.inSampleSize = 2
val compressedBitmap = BitmapFactory.decodeFile(pathName,options)
2.色彩压缩
val options = BitmapFactory.Options()
options.inPreferredConfig = Bitmap.Config.RGB_565
val compressedBitmap = BitmapFactory.decodeFile(pathName,options)
3.裁剪压缩
降低图片分辨率,减小图片尺寸。比如将图片缩小一半:
val bitmap = BitmapFactory.decodeFile(path)
val matrix = Matrix()
matrix.setScale(0.5f, 0.5f)
val scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width / 2, bitmap.height / 2, matrix, true)
采用哪种压缩方式,根据业务场景而定,例如用户头像用裁剪压缩,其他场景一般常用质量压缩等等。
图片处理框架
在Java应用中使用
这里推荐一个Google开源的图片处理框架Thumbnailator。它可以对图片进行缩放、裁剪、压缩、旋转、加水印等操作。详细介绍和更多的使用指南,请访问开源地址:https://github.com/coobird/thumbnailator
此框架常用于服务端处理图片,搞后端的同学应该对其并不陌生。
集成依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
要实现图片压缩,用法也非常简单:
Thumbnails.of(srcFile)//源文件
.scale(1.0)//缩放级别:0-1
.outputQuality(0.5f)//输出质量:0-1
.toFile(toFilePath);//目标路径
根据实际使用得知,压缩后的图片文件大小能降低50%甚至更多,而且画质损失极小,基本难以感知到。
在Android项目中使用
Thumbnailator虽然是基于Java的,但是它用到了java.awt.*里面的类,在Android中无法访问到这些类,而且将java.awt包导入Android项目的成本也比较高,所以Thumbnailator尽管优秀,但可惜无法应用于移动端。
Android中比较知名的图片压缩框架是Luban和Compressor。Luban的压缩算法听说是根据微信图片压缩逆推的;Compressor则支持Kotlin的协程。
Luban开源地址:https://github.com/Curzibn/Luban
Compressor开源地址:https://github.com/zetbaitsu/Compressor
Compressor使用方便且API比较简单,下面介绍Compressor的简单使用:
集成:
implementation 'id.zelory:compressor:3.0.0'
使用:
val toFile = File(toPath)//压缩后图片的保存路径
val resultPath = Compressor.compress(context, toFile) {
quality(25)//压缩质量0-100
}.path
压缩后画质还行,25的quality图片大小减少50%甚至更多;quality为50时,图片大小减幅不大,在50%以内。