Need help with Luban?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Curzibn
12.2K Stars 2.1K Forks Apache License 2.0 187 Commits 133 Opened issues

Description

Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法

Services available

!
?

Need anything else?

Contributors list

No Data

Luban

Build Status Download

Luban
(鲁班) ——
Android
图片压缩工具,仿微信朋友圈压缩策略。

Luban-turbo
—— 鲁班项目的
turbo
版本,查看
trubo
分支

写在前面

家境贫寒,工作繁忙。只能不定期更新,还望网友们见谅!

项目描述

目前做

App
开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。

于是自然想到

App
巨头“微信”会是怎么处理,
Luban
(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。

因为有其他语言也想要实现

Luban
,所以描述了一遍算法步骤

因为是逆向推算,效果还没法跟微信一模一样,但是已经很接近微信朋友圈压缩后的效果,具体看以下对比!

效果与对比

内容

原图

Luban
Wechat
截屏 720P 7201280,390k 7201280,87k 7201280,56k
截屏 1080P 10801920,2.21M 10801920,104k 10801920,112k
拍照 13M(4:3) 30964128,3.12M 15482064,141k 15482064,147k
拍照 9.6M(16:9) 41282322,4.64M 1032581,97k 1032581,74k
滚动截屏 10806433,1.56M 10806433,351k 1080*6433,482k

导入

implementation 'top.zibin:Luban:1.1.8'

使用

方法列表

方法

描述
load 传入原图
filter 设置开启压缩条件
ignoreBy 不压缩的阈值,单位为K
setFocusAlpha 设置是否保留透明通道
setTargetDir 缓存压缩图片路径
setCompressListener 压缩回调接口
setRenameListener 压缩前重命名接口

异步调用

Luban
内部采用
IO
线程进行图片压缩,外部调用只需设置好结果监听即可:
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();

同步调用

同步方法请尽量避免在主线程调用以免阻塞主线程,下面以rxJava调用为例

Flowable.just(photos)
    .observeOn(Schedulers.io())
    .map(new Function, List>() {
      @Override public List apply(@NonNull List list) throws Exception {
        // 同步方法直接返回压缩后的文件
        return Luban.with(MainActivity.this).load(list).get();
      }
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe();

RELEASE NOTE

Here

License

Copyright 2016 Zheng Zibin

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.