在日常的Android
开发当中,我们肯定会遇到对上传的图片先进行压缩
的需求,这里推荐一个常用的图片压缩框架——Luban
,希望能帮小伙伴们在开发中提高效率。
Luban
Luban
,中文名称是鲁班
,是仿朋友圈的压缩策略。
引入项目
implementation 'top.zibin:Luban:1.1.8'
截止我发博客最新的版本是1.1.8
,最新的Luban版本请查看wiki
压缩效果对比
作者有提高一个压缩对比提供参考。
内容 | 原图 | Luban | |
---|---|---|---|
截屏 720P | 720x1280,390k | 720x1280,87k | 720x1280,56k |
截屏 1080P | 1080x1920,2.21M | 1080x1920,104k | 1080x1920,112k |
拍照 13M(4:3) | 3096x4128,3.12M | 1548x2064,141k | 1548x2064,147k |
拍照 9.6M(16:9) | 4128x2322,4.64M | 1032x581,97k | 1032x581,74k |
滚动截屏 | 1080x6433,1.56M | 1080x6433,351k | 1080x6433,482k |
看到这个压缩对比,发现还是和朋友圈的相近的,看到开源库作者说是通过逆推出算法,真的厉害。
方法列表
方法 | 描述 |
---|---|
load | 传入原图 |
filter | 设置开启压缩条件 |
ignoreBy | 不压缩的阈值,单位为K |
setFocusAlpha | 设置是否保留透明通道 |
setTargetDir | 缓存压缩图片路径 |
setCompressListener | 压缩回调接口 |
setRenameListener | 压缩前重命名接口 |
异步压缩的例子
Luban.with(this)
.load(photos)
.ignoreBy(100)
.setTargetDir(getPath())
.filter(new CompressionPredicate() {
@Override
public boolean apply(String path) {
return !(TextUtils.isEmpty(path) || path.toLowerCase().endsWith(".gif"));
}
})
.setCompressListener(new OnCompressListener() {
@Override
public void onStart() {
// TODO 压缩开始前调用,可以在方法内启动 loading UI
}
@Override
public void onSuccess(File file) {
// TODO 压缩成功后调用,返回压缩后的图片文件
}
@Override
public void onError(Throwable e) {
// TODO 当压缩过程出现问题时调用
}
}).launch();
同步压缩的例子
Flowable.just(photos)
.observeOn(Schedulers.io())
.map(new Function<List<String>, List<File>>() {
@Override public List<File> apply(@NonNull List<String> list) throws Exception {
// 同步方法直接返回压缩后的文件
return Luban.with(MainActivity.this).load(list).get();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
网友评论