74
GitHub - Curzibn/Luban: Luban(鲁班)—Image compression with efficiency very close...
source link: https://github.com/Curzibn/Luban
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
Luban
Luban
(鲁班) —— Android
图片压缩工具,仿微信朋友圈压缩策略。
Luban-turbo
—— 鲁班项目的turbo
版本,查看trubo
分支。
写在前面
家境贫寒,工作繁忙。只能不定期更新,还望网友们见谅!
项目描述
目前做App
开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。
于是自然想到App
巨头“微信”会是怎么处理,Luban
(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。
因为有其他语言也想要实现Luban
,所以描述了一遍算法步骤。
因为是逆向推算,效果还没法跟微信一模一样,但是已经很接近微信朋友圈压缩后的效果,具体看以下对比!
效果与对比
内容 原图Luban
Wechat
截屏 720P
720*1280,390k
720*1280,87k
720*1280,56k
截屏 1080P
1080*1920,2.21M
1080*1920,104k
1080*1920,112k
拍照 13M(4:3)
3096*4128,3.12M
1548*2064,141k
1548*2064,147k
拍照 9.6M(16:9)
4128*2322,4.64M
1032*581,97k
1032*581,74k
滚动截屏
1080*6433,1.56M
1080*6433,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<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();
RELEASE NOTE
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.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK