Luban—— Android图片压缩工具


前言

自己写的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
    评论
Luban(鲁班)——Android图片压缩工具,仿微信朋友圈压缩策略。项目描述目前做app开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。于是自然想到app巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。因为有其他语言也想要实现 Luban,所以描述了一遍算法步骤 因为是逆向推算,效果还没法跟微信一模一样,但是已经很接近微信朋友圈压缩后的效果,具体看以下对比!效果与对比内容原图LubanWechat截屏 720P720*1280,390k720*1280,87k720*1280,56k截屏 1080P1080*1920,2.21M1080*1920,104k1080*1920,112k拍照 13M(4:3)3096*4128,3.12M1548*2064,141k1548*2064,147k拍照 9.6M(16:9)4128*2322,4.64M1032*581,97k1032*581,74k滚动截屏1080*6433,1.56M1080*6433,351k1080*6433,482k导入compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.6' compile 'top.zibin:Luban:1.0.5'使用Listener方式Luban内部采用io线程进行图片压缩,外部调用只需设置好结果监听即可Luban.get(this)     .load(File)                     //传人要压缩的图片     .putGear(Luban.THIRD_GEAR)      //设定压缩档次,默认三挡     .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();    //启动压缩RxJava方式RxJava 调用方式请自行随意控制线程Luban.get(this)         .load(file)         .putGear(Luban.THIRD_GEAR)         .asObservable()         .subscribeOn(Schedulers.io())         .observeOn(AndroidSchedulers.mainThread())         .doOnError(new Action1() {             @Override             public void call(Throwable throwable) {                 throwable.printStackTrace();             }         })         .onErrorResumeNext(new Func1>() {             @Override             public Observable<? extends File> call(Throwable throwable) {                 return Observable.empty();             }         })         .subscribe(new Action1() {             @Override             public void call(File file) {                 //TODO 压缩成功后调用,返回压缩后的图片文件             }         }); 标签:Luban(鲁班)
Android 中进行图片压缩可以使用以下两种方式: 1. 使用 BitmapFactory 进行图片压缩 ```java public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // 首先将 inJustDecodeBounds 设置为 true,解析图片的宽高信息,不将图片的像素加载到内存中 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 根据计算出的 inSampleSize 来进行图片的压缩 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 将 inJustDecodeBounds 设置为 false,重新解析图片,这次会将图片的像素加载到内存中 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 获取图片的原始宽高 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; // 如果图片的宽高比目标宽高大,则进行压缩 if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // 计算 inSampleSize 的值,确保宽高都不会超过目标宽高 while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } return inSampleSize; } ``` 调用该方法时,可以指定需要压缩到的目标宽高: ```java Bitmap compressedBitmap = decodeSampledBitmapFromResource(getResources(), R.drawable.image, 500, 500); ``` 2. 使用第三方库进行图片压缩Android 中有很多第三方库可以用来进行图片压缩,比如: - Luban:https://github.com/Curzibn/Luban - Compressor:https://github.com/zetbaitsu/Compressor 这些库通常都提供了简单易用的 API,可以很方便地进行图片压缩

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值