登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 2146|回复: 8

最接近微信朋友圈的图片压缩算法【Bus Weekly】二十三期

[复制链接]
 成长值: 3400

3011

主题

3340

帖子

7589

安币

VIP3

积分
4268

签到达人活跃会员推广达人优秀版主元老勋章明星会员

QQ
发表于 2016-10-17 17:36:46 | 显示全部楼层 |阅读模式

Luban
Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。
项目描述
目前做App开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。
于是自然想到App巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。
因为有其他语言也想要实现Luban,所以描述了一遍算法步骤
因为是逆向推算,效果还没法跟微信一模一样,但是已经很接近微信朋友圈压缩后的效果,具体看以下对比!

效果图
7n49p81vhokm3btg58cn5tjiq1_0f7a6fc7fbda26cd67fa6ccb78986e9f1476694179.0993.gif
效果与对比

QQ截图20161017163759.png

导入


[XML] 查看源文件 复制代码
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'

compile 'top.zibin:Luban:1.0.9'

Release Notesv1.0.9, 2016/10/14
  • 修改压缩后文件自带后缀,根据(#77)提供的思路
使用Listener方式
Luban内部采用IO线程进行图片压缩,外部调用只需设置好结果监听即可:
[Java] 查看源文件 复制代码
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调用方式请自行随意控制线程:
[Java] 查看源文件 复制代码
Luban.get(this)
        .load(file)
        .putGear(Luban.THIRD_GEAR)
        .asObservable()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError(new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                throwable.printStackTrace();
            }
        })
        .onErrorResumeNext(new Func1<Throwable, Observable<? extends File>>() {
            @Override
            public Observable<? extends File> call(Throwable throwable) {
                return Observable.empty();
            }
        })
        .subscribe(new Action1<File>() {
            @Override
            public void call(File file) {
                // TODO 压缩成功后调用,返回压缩后的图片文件
            }
        }).launch();    //启动压缩


方法对应表

QQ截图20161017164337.png

作者:郑梓斌
源码下载:https://github.com/Curzibn/Luban


【Bus Weekly】二十三期

【一周优秀博文】

Retrofit2使用介绍
/blog-705730-62021.html

View的事件分发机制
/blog-705730-62020.html


聊聊IntentService那些事
/blog-705730-62019.html

懒加载Fragment 让应用更优化
/blog-705730-62015.html


View 的工作原理上 View 绘制流程梳理及 Measure 过程详解
/blog-705730-62007.html

简单实用的Android ORM框架TigerDB
/blog-705730-62003.html

基于OkHttp的封装库TigerOkHttp的使用
/blog-705730-62001.html

Dagger依赖注入浅析
/blog-705730-61996.html

Android RecyclerView绘制原理
/blog-705730-61960.html

PowerfulRecyclerView使用指导和源码分析
/blog-705730-61947.html


Android Studio多渠道打包和代码混淆教程
/blog-705730-61942.html

【一周Android精品源码推荐】


一款简易的聚合数据天气预报
/forum.php?mod=viewthread&tid=269140&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

自定义回到顶部按钮
/forum.php?mod=viewthread&tid=269106&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

自定义View实现热门标签效果的流式布局
/forum.php?mod=viewthread&tid=269056&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

基于Xmpp协议的即时通讯社交软件(客户端+服务端)
/forum.php?mod=viewthread&tid=268959&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

HappyReader一款新闻视频app
/forum.php?mod=viewthread&tid=268956&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

对RecyclerView的一个封装,添加一些实用的功能
/forum.php?mod=viewthread&tid=268949&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

一个平滑酷炫的分享按钮动画
/forum.php?mod=viewthread&tid=268917&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26sortid%3D12

高仿熊猫TV直播app UI
/forum.php?mod=viewthread&tid=268269&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost%26digest%3D1%26sortid%3D12

近乎完美的互动直播源码,超低延时,标准RTMP方案无缝替换
/forum.php?mod=viewthread&tid=268730&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost%26digest%3D1%26sortid%3D12

最好玩的Android开源连连看
/forum.php?mod=viewthread&tid=266434&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost%26digest%3D1%26sortid%3D12

【一周优秀实例教程】


Android Studio ndk-Jni开发详细
/forum.php?mod=viewthread&tid=258012&extra=page%3D10%26filter%3Dauthor%26orderby%3Ddateline

Android子线程真的不能更新UI么
/forum.php?mod=viewthread&tid=258008&extra=page%3D10%26filter%3Dauthor%26orderby%3Ddateline

RxAndroid简单使用方法
/forum.php?mod=viewthread&tid=257969&extra=page%3D10%26filter%3Dauthor%26orderby%3Ddateline

代码规范和Android项目中的一些可用工具
/forum.php?mod=viewthread&tid=257960&extra=page%3D11%26filter%3Dauthor%26orderby%3Ddateline

Android Studio 中 Gradle 依赖的统一管理
/forum.php?mod=viewthread&tid=257844&extra=page%3D11%26filter%3Dauthor%26orderby%3Ddateline

Android studio翻译插件,告别蒙逼
/forum.php?mod=viewthread&tid=257803&extra=page%3D11%26filter%3Dauthor%26orderby%3Ddateline

Android 开学须知:GreenDao缓存
/forum.php?mod=viewthread&tid=257793&extra=page%3D11%26filter%3Dauthor%26orderby%3Ddateline

如何切换Fragment时实现数据保持
/forum.php?mod=viewthread&tid=257645&extra=page%3D12%26filter%3Dauthor%26orderby%3Ddateline

ActionBar样式完全详解
/forum.php?mod=viewthread&tid=257477&extra=page%3D12%26filter%3Dauthor%26orderby%3Ddateline

完美解决安卓上层输入控件随键盘弹起,下层UI不变形问题
/forum.php?mod=viewthread&tid=256724&extra=page%3D14%26filter%3Dauthor%26orderby%3Ddateline

第二十三周巴士之星公布

优秀博主:woshidasusu夏睿

精品源码热心巴友:curzbinForezpverney

问答区热心巴友:lilongfei0504

see you 咱们下期见~

安卓巴士官方微博链接

安卓巴士微信公众号


Bus Weekly回顾




[官方活动] 安卓巴士菁英会会员招募中~


安卓巴士线下活动【主题】【形式】我做主!!回复可得50安币~

/thread-266712-1-1.html?_dsign=88e7cfaf

【独家】老罗最新一季Android教学视频之旅(总汇)



致安卓巴士版主(及2016年版主招募计划启动中!)



原创文章,2016年׿ʿ助你上头条







活动行封面_sz.jpg

1

主题

553

帖子

202

安币

代码手工艺人

Rank: 4

积分
590

推广达人

发表于 2016-10-17 17:39:48 | 显示全部楼层
写的真的很不错

0

主题

334

帖子

-69

安币

攻城狮

Rank: 3Rank: 3

积分
333
发表于 2016-10-17 17:45:48 | 显示全部楼层
写的真的很不错

85

主题

1040

帖子

150

安币

Android大神

Rank: 6Rank: 6

积分
1039
发表于 2016-10-17 17:49:58 | 显示全部楼层
mark,收藏了

62

主题

1024

帖子

1362

安币

Android大神

学海无涯

Rank: 6Rank: 6

积分
2010

QQ达人

发表于 2016-10-17 17:51:28 | 显示全部楼层
学习...学习...

8

主题

537

帖子

-70

安币

代码手工艺人

Rank: 4

积分
536
发表于 2016-10-17 17:58:18 | 显示全部楼层
帮帮顶顶!!

6

主题

562

帖子

-121

安币

代码手工艺人

Rank: 4

积分
624
发表于 2016-10-17 18:03:18 | 显示全部楼层
不错不错,楼主辛苦了。。。

0

主题

42

帖子

262

安币

初级码农

Rank: 1

积分
42
发表于 2016-10-19 09:26:41 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:)
*滑动验证:
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /7 下一条
联系我们
关闭
合作电话:
13802416937
Email:
[email protected]
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表