Curzibn / Luban

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

两组图片通过zip来合并压缩请求,这样会有问题么? #336

Closed longdw closed 5 years ago

longdw commented 5 years ago
Observable<List<File>> orderObser = me.shaohui.advancedluban.Luban.compress(orderFiles, new File(path))
                    .setMaxSize(200)                // 限制最终图片大小(单位:Kb)
                    // 自定义压缩图片格式,目前只支持:JEPG和WEBP,因为png不支持压缩图片品质
                    .putGear(Luban.CUSTOM_GEAR)     // 使用 CUSTOM_GEAR 压缩模式
                    .asListObservable();

            Observable<List<File>> warrantyObser = me.shaohui.advancedluban.Luban.compress(warrantyFiles, new File(path))
                    .setMaxSize(200)                // 限制最终图片大小(单位:Kb)
                    // 自定义压缩图片格式,目前只支持:JEPG和WEBP,因为png不支持压缩图片品质
                    .putGear(Luban.CUSTOM_GEAR)     // 使用 CUSTOM_GEAR 压缩模式
                    .asListObservable();

            Observable.zip(orderObser, warrantyObser, new BiFunction<List<File>, List<File>, Map<String, List<File>>>() {
                @Override
                public Map<String, List<File>> apply(List<File> files, List<File> files2) throws Exception {

                    Map<String, List<File>> maps = new HashMap<>();
                    maps.put("file", files);
                    maps.put("warranty", files2);

                    return maps;
                }
            }).subscribe(new BaseSimpleObserver<Map<String, List<File>>>() {
                @Override
                protected void onHandleSuccess(Map<String, List<File>> maps) {
                    if (mView != null) {//所有的照片
                        mView.onCompreSuccess(maps);
                    }
                }

                @Override
                protected void onHandleError(Throwable e) {
                    if (mView != null) {
                        mView.onCompreError(e);
                    }
                }

                @Override
                public void onSubscribe(Disposable d) {
                    addDisposable(d);
                }
            });

想问下作者,这样我压缩两组照片会不会有问题呢?在生产环境中出现这样的情况,两组照片如: A、B两组,A组有照片x,B组有照片y、z,但是压缩后发现B组变成了x、z,也就是原本B组中的y照片消失了,变成了A组中的x了。

longdw commented 5 years ago

特意实验了很多遍,确实会出现这种串的情况,两组照片,通过zip压缩,然后会出现某一组压缩后的照片跟压缩前对应不上。大概3次就会出现一次这种情况。

longdw commented 5 years ago

另外刚又发现,不用zip,两组并行的去压缩,也会出现类似的情况,打印出来的结果显示,压缩后的照片和压缩前的不一致。代码如下

me.shaohui.advancedluban.Luban.compress(orderFiles, new File(path))
                    .setMaxSize(200)                // 限制最终图片大小(单位:Kb)
                    // 自定义压缩图片格式,目前只支持:JEPG和WEBP,因为png不支持压缩图片品质
                    .putGear(Luban.CUSTOM_GEAR)     // 使用 CUSTOM_GEAR 压缩模式
                    .asListObservable().subscribe(new Observer<List<File>>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            addDisposable(d);
                        }

                        @Override
                        public void onNext(List<File> files) {
                            maps.put("file", files);
                            handleZipCompress(maps);
                        }

                        @Override
                        public void onError(Throwable e) {
                            if (mView != null) {
                                mView.onCompreError(e);
                            }
                        }

                        @Override
                        public void onComplete() {

                        }
                    });

            me.shaohui.advancedluban.Luban.compress(warrantyFiles, new File(path))
                    .setMaxSize(200)                // 限制最终图片大小(单位:Kb)
                    // 自定义压缩图片格式,目前只支持:JEPG和WEBP,因为png不支持压缩图片品质
                    .putGear(Luban.CUSTOM_GEAR)     // 使用 CUSTOM_GEAR 压缩模式
                    .asListObservable().subscribe(new Observer<List<File>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    addDisposable(d);
                }

                @Override
                public void onNext(List<File> files) {
                    maps.put("warranty", files);
                    handleZipCompress(maps);
                }

                @Override
                public void onError(Throwable e) {
                    if (mView != null) {
                        mView.onCompreError(e);
                    }
                }

                @Override
                public void onComplete() {

                }
            });

我是通过这种方式去检查的:

StringBuilder sb = new StringBuilder();

        for (String key : mapFiles.keySet()) {
            sb.append(key).append("\n");
            List<File> files = mapFiles.get(key);
            for (File file : files) {
                sb.append(file.getAbsolutePath()).append("\n");
            }
        }

        new AlertDialog.Builder(this).setMessage(sb.toString()).setPositiveButton("确定", null).show();
WX20190605-105916@2x

只要发现打印的两组中有一样的路径,肯定是有问题的。各位有遇到类似的情况还请指导下怎么解决。@Curzibn