dragon66 / icafe

Java library for reading, writing, converting and manipulating images and metadata
Eclipse Public License 1.0
204 stars 58 forks source link

bitmap转gif摩尔纹&噪点问题 #115

Open AndyYoung1004 opened 1 year ago

AndyYoung1004 commented 1 year ago

hi dragon66:

大佬,你好,非常感谢这个gif工具,帮我解决了很大问题, 我在使用中发现,某些图片经过gif编码之后,会产生摩尔纹,同样的照片我用三星手机的相册生成摩尔纹比较轻微,三星用的是一家开源算法叫做quramsoft的图片处理算法,猜测是算法效果的差异。 请问我们这个方案有办法解决这个问题吗?我打开了dither功能优化不大,下面是我的代码:

            Bitmap bitmap1 = BitmapFactory.decodeFile("/sdcard/DCIM/girl1.jpg");
            bitmap1 = Bitmap.createScaledBitmap(bitmap1, WIDTH, HEIGHT, true);

            Bitmap bitmap2 = BitmapFactory.decodeFile("/sdcard/DCIM/girl2.jpg");
            bitmap2 = Bitmap.createScaledBitmap(bitmap2, WIDTH, HEIGHT, true);

            Bitmap bitmap3 = BitmapFactory.decodeFile("/sdcard/DCIM/boy.jpg");
            bitmap3 = Bitmap.createScaledBitmap(bitmap3, WIDTH, HEIGHT, true);

            AnimatedGIFWriter writer = new AnimatedGIFWriter(true);
            try {
                OutputStream os = new FileOutputStream("/sdcard/DCIM/dragon.gif");
                writer.prepareForWrite(os, -1, -1);
                writer.writeFrame(os, bitmap1, 1000);
                writer.writeFrame(os, bitmap2, 1000);
                writer.writeFrame(os, bitmap3, 1000);
                writer.finishWrite(os);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
AndyYoung1004 commented 1 year ago

附件中是2个对比的gif文件,可以看到在图片噪点控制方面,三星的效果比我们当前效果要好一些

dragon66 commented 1 year ago

@AndyYoung1004 这个程序目前没有太大空间可以设置不同的量化和抖动方法。默认是吴氏量化和弗洛伊德抖动。在quant目录下有一个更好的量化算法neuquant。你可以试试和这个结合一下。据我测试,很多时候不用抖动效果就很好。至于抖动,同一目录下还有一个Bayer方法和相关的矩阵可用。你都可以试一下。我手机看不了邮件附件所以不知有多大差别。你如果能付到这个问题下我就能看到区别了。

可以看到了。不过我觉得差别并不是很明显。我相信如果你用neuquant量化算法效果可能会比三星的好。

AndyYoung1004 commented 1 year ago

@dragon66 尝试了一下wuquant和nequant,发现wuquant的效果更好 抖动目前都还好,主要还是有些图片会有一圈一圈的摩尔纹出现,不知道摩尔纹是不是和量化方法有关

AndyYoung1004 commented 1 year ago

摩尔纹的问题,我猜测是和调色盘有关系,我们有办法增大调色盘的颜色种类吗?

https://zhuanlan.zhihu.com/p/565191032?utm_id=0

这篇文章里面有对比增加调色盘梳理,改善整体效果

dragon66 commented 1 year ago

如果是摩尔纹应当和硬件关系更大。单纯从量化角度来说对特殊空间颜色分布的图片有可能产生纹路。所以通常要加入抖动模糊一下。至于色盘的选择通常是量化的一部分,按照各种颜色出现的频率选几率最高的小于256色的作为色盘。这其中并不会考虑颜色的空间分布。编码已经做到利用256色内的所有颜色了,没有办法增加颜色了。

你提供的链接我看了一下,主要着重在通过减少帧数和色盘颜色来减少文件尺寸。这对你的应用没有帮助。

如果改变量化算法无法提高效果那问题就比较复杂了。由于这个编码器是作为整个程序库的一个小部分,目前无法做到优化和最精。