Curzibn / Luban

Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法
Apache License 2.0
13.55k stars 2.24k forks source link

讨论帖,新需求与新想法集中营 #6

Closed wo327808864 closed 8 years ago

wo327808864 commented 8 years ago

您这个是图片上传的时候,本地图片压缩吗? 我之前也研究过微信朋友圈的图片压缩,当时得到的结果是: 第一步进行采样率压缩; 第二步进行宽高的等比例压缩(微信对原图和缩略图限制了最大长宽或者最小长宽); 第三步就是对图片的质量进行压缩(一般75或者70); 第四部就是采用webP的格式。 经过这四部的处理,基本上和微信朋友圈的效果一致,包括文件大小和显示效果。 (PS:最近看到微信朋友圈好像换了图片格式,这还有待考证)

Curzibn commented 8 years ago

是在上传进行本地图片压缩,目前的步骤只占了您描述的第二与第三步。 因为我主要研究了微信对不同大小,比例的图片进行等比例压缩的策略, 如果您有时间请您加入到 Luban 的开源中

Lsy1992 commented 8 years ago

顺便提问一下,请问您这个工具做了重复压缩的处理吗? 比如说一张图片已经压缩过之后在选择就不压缩了。这个问题之前一直很困扰我

Curzibn commented 8 years ago

@Lsy1992 基于 Luban 的压缩机制,被压缩过的图片再次用 Luban 处理是有可能被重复压缩的。 微信朋友圈也有这样的机制。 被重复压缩有两个条件:比例与分辨率

  1. Luban 对不同的长宽比的图片采取的比例压缩策略是不同的。主要算法是最长边超过某个值 -- a 除以 2 的平方数。但是微信那边可能考虑到实际显示效果,图片比例在区间[1,0.5625)(注:所有比例均是短边除以长边)内的 a 是不规则的 2.当比例在上述区间内的图片分辨率超大的时候(例:12580*12580)第一次压缩满足边长除以 8 的条件,压缩后再进行压缩的话边长依然满足除以 2 的条件,最后再用 Luban 处理则不会进行压缩了

总结:图片在 Luban 上出现重复压缩的情况不会是盲目压缩,而是由算法条件决定的。

Lsy1992 commented 8 years ago

OK,那这也很好了,我就怕用户故意一直使用同一张图上传,结果每次都压缩,到最后用的次数多了这张图已经模糊不清

saaya009 commented 8 years ago

如果同时压缩9张,每张大小是2mb左右,有没有试过?时间大约会是多久?能不能9张压缩完只用200ms @Lsy1992

Lsy1992 commented 8 years ago

@saaya009 这个不太可能,因为9张图它的图片数据都不一样的话,有大有小,很难控制到200ms以内完成的吧

Curzibn commented 8 years ago

@saaya009 其实这个我也研究过微信的机制。 我不觉得压缩时间是大问题,因为一般用到压缩的时候下一步操作就是上传图片。所以微信的压缩跟上传是绑定的,如果你选取图片很多压缩时间加上上传时间自然会有点久,但是这种情况就是用户可以接受的。 这里不必要追求极致的压缩时间,而应该追求极致的压缩效果。

XunMengWinter commented 8 years ago

建议取消回调(因为同线程,回调没有意义),直接返回File以便于RxJava或多线程操作。

Curzibn commented 8 years ago

@XunMengWinter 谢谢你的建议,RxJava会出单独的方法,回调的话也会由 Luban 来完成线程控制

wo327808864 commented 8 years ago

@Lsy1992 我同意 @Curzibn 的,时间不是大问题。你应该看过微信和微博,没有网络的时候都可以发朋友圈,是后台进行数据上传的。

wo327808864 commented 8 years ago

@Curzibn 我们还加入了对长图的展示。条件也很简单:判断长宽比大于1.5认为是长图,不进行压缩,直接上传原图(有些长图带大量文字展示,不是原图的话,放大之后会看不清楚)。 现在有个问题还没解决,长图进行缩略图展示的时候,会比较模糊,还没时间看这个问题。 你们可以参考一下,针对长图的这一块,希望有更好的处理,现在长图使用还是很广泛。

LongAgoLong commented 8 years ago

建议缓存路径应该可以自行设置

Curzibn commented 8 years ago

@wo327808864 长图这一块是最困难的,我在测试微信的长图压缩规则的时候对比各种图片后发现没有明显的线性规律。 所以我猜测微信对长图的处理可能采用一些曲线函数。目前得出的结论是长图不会超过500k,如果一张长图的比例超级大放上朋友圈还是会模糊的 长图不做处理还是不行的,我传过13M的长图到朋友圈过,确实会模糊 长图这一块希望有人能跟我一起讨论实验,最好是数学超好的!

Curzibn commented 8 years ago

@LongAgoLong 已在你提的另一个 issues 中回答你的问题,可以到 close中查看

xiaogu-space commented 8 years ago

把简单的功能做到极致就是最好的

XunMengWinter commented 8 years ago

压缩质量还需提高,下面这张图片,放微信和放Luban压出来的效果差距有点大。在噪点、色彩渐变方面得用算法来完善。 https://raw.githubusercontent.com/XunMengWinter/source/1bbe9d1143514904b6558df5159f444f09bc6bf9/images/pisa.jpg

tyousyuka commented 8 years ago

多图片批量压缩,完成一张回调返回一张

XunMengWinter commented 8 years ago

建议Demo 去掉PhotoPicker ,使用 new File(uri.getPath()) 获取图片文件。