Luban


前言

自己写的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)
计算压缩图片的实际文件大小,以第23步结果为准,图片比例越大则文件越大。
size = (newW * newH) / (width * height) * m;


[1, 0.5625) 则 width & height 对应 166449901280 * n(n≥3),m 对应 150300300[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 对应 6060100
[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值