前言
自己写的bitmap压缩不够优秀,找了个优秀的图片压缩框架一、Luban是什么?
Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。二、使用步骤
1.引入库
implementation 'top.zibin:Luban:1.1.8'
2.使用
一张一张压缩 Observable.fromIterable(images == null ? new ArrayList<>() : images)
.observeOn(Schedulers.io())
.map(new Function<ImageItem, String>() {
@Override
public String apply(ImageItem imageItem) throws Exception {
return imageItem.path;
}
})
.map(new Function<String, File>() {
@Override
public File apply(String path) throws Exception {
return Luban.with(getContext()).load(path).get(path);
}
})
一组一组压缩
...
return Luban.with(MainActivity.this).load(list).get();
....
不支持直接压缩网络图片,可以借助Glide
Observable.just(url)
.observeOn(Schedulers.io())
.map(new Function<String, File>() {
@Override
public File apply(String s) throws Exception {
FutureTarget<File> fileFutureTarget = Glide.with(getContext()).asFile().load(url).submit();
return fileFutureTarget.get();
}
})
.map(uri -> Luban.with(getContext()).ignoreBy(32).load(uri).get(uri.getAbsolutePath()))
3.API
方法 | 描述 |
---|---|
load | 传入原图 |
filter | 设置开启压缩条件 |
ignoreBy | 不压缩的阈值,单位为K |
setFocusAlpha | 设置是否保留透明通道 |
setTargetDir | 缓存压缩图片路径 |
setCompressListener | 压缩回调接口 |
setRenameListener | 压缩前重命名接口 |
三、解析源码
Luban 是由作者Jerry Lee 逆推出的算法,牛啊牛
第三挡压缩(参考最新版微信压缩效果)
判断图片比例值,是否处于以下区间内;
[1, 0.5625) 即图片处于 [1:1 ~ 9:16) 比例范围内
[0.5625, 0.5) 即图片处于 [9:16 ~ 1:2) 比例范围内
[0.5, 0) 即图片处于 [1:2 ~ 1:∞) 比例范围内
判断图片最长边是否过边界值;
[1, 0.5625) 边界值为:1664 * n(n=1), 4990 * n(n=2), 1280 * pow(2, n-1)(n≥3)
[0.5625, 0.5) 边界值为:1280 * pow(2, n-1)(n≥1)
[0.5, 0) 边界值为:1280 * pow(2, n-1)(n≥1)
计算压缩图片实际边长值,以第2步计算结果为准,超过某个边界值则:width / pow(2, n-1),height/pow(2, n-1)
计算压缩图片的实际文件大小,以第2、3步结果为准,图片比例越大则文件越大。
size = (newW * newH) / (width * height) * m;
[1, 0.5625) 则 width & height 对应 1664,4990,1280 * n(n≥3),m 对应 150,300,300;
[0.5625, 0.5) 则 width = 1440,height = 2560, m = 200;
[0.5, 0) 则 width = 1280,height = 1280 / scale,m = 500;注:scale为比例值
判断第4步的size是否过小
[1, 0.5625) 则最小 size 对应 60,60,100
[0.5625, 0.5) 则最小 size 都为 100
[0.5, 0) 则最小 size 都为 100
将前面求到的值压缩图片 width, height, size 传入压缩流程,压缩图片直到满足以上数值
源码解析详细:
https://www.jianshu.com/p/dee55eb81f4c
四、混淆
不需要为Luban添加额外混淆作者地址
CodeChina Luban:https://codechina.csdn.net/mirrors/curzibn/luban?utm_source=csdn_github_accelerator
Github Luban:https://github.com/Curzibn/Luban