
圖片來源網(wǎng)絡(luò),入侵必刪
在日常的Android開發(fā)當(dāng)中,我們肯定會(huì)遇到對(duì)上傳的圖片先進(jìn)行壓縮的需求,這里推薦一個(gè)常用的圖片壓縮框架——Luban,希望能幫小伙伴們?cè)陂_發(fā)中提高效率。
Luban
Luban,中文名稱是魯班,是仿朋友圈的壓縮策略。
引入項(xiàng)目
implementation 'top.zibin:Luban:1.1.8'
截止我發(fā)博客最新的版本是1.1.8,最新的Luban版本請(qǐng)查看wiki
壓縮效果對(duì)比
作者有提高一個(gè)壓縮對(duì)比提供參考。
| 內(nèi)容 | 原圖 | 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 |
| 滾動(dòng)截屏 | 1080x6433,1.56M | 1080x6433,351k | 1080x6433,482k |
看到這個(gè)壓縮對(duì)比,發(fā)現(xiàn)還是和朋友圈的相近的,看到開源庫(kù)作者說是通過逆推出算法,真的厲害。
方法列表
| 方法 | 描述 |
|---|---|
| load | 傳入原圖 |
| filter | 設(shè)置開啟壓縮條件 |
| ignoreBy | 不壓縮的閾值,單位為K |
| setFocusAlpha | 設(shè)置是否保留透明通道 |
| setTargetDir | 緩存壓縮圖片路徑 |
| setCompressListener | 壓縮回調(diào)接口 |
| 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 壓縮開始前調(diào)用,可以在方法內(nèi)啟動(dòng) loading UI
}
@Override
public void onSuccess(File file) {
// TODO 壓縮成功后調(diào)用,返回壓縮后的圖片文件
}
@Override
public void onError(Throwable e) {
// TODO 當(dāng)壓縮過程出現(xiàn)問題時(shí)調(diào)用
}
}).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();