颜色量化会产生非常糟糕的结果?

时间:2015-03-27 21:00:30

标签: java algorithm imagemagick gif quantization

我试图让我的应用程序导出GIF动画,但是,一旦颜色超过256,量化算法就会启动并且事情变得错误。

这是我要转换的文件,以及算法将其转换为:

enter image description here

量化算法我使用is this, Quantize.java,它显然是 ImageMagick 中使用的量化的Java端口,所以我觉得它应该可靠吗? / p>

我这样使用它:

protected int[][] pixels;  // 2D array of RGB pixels of image
protected byte[] indexedPixels;

// ...

/**
 * Analyzes image colors and creates color map.
 */
protected void analyzePixels()
{
    // Quantize the pixels, get reduced color map and indexed array.
    // -------------------------------------------------------------
    colorPalette = Quantize.quantizeImage(pixels, 256);

    // Create indexed pixels array.
    // ----------------------------
    int i = 0;

    for (int x = 0, xSize = pixels.length; x < xSize; ++x)
    {
        for (int y = 0, ySize = pixels[x].length; y < ySize; ++y)
            indexedPixels[i++] = (byte) pixels[x][y];
    }
}

注意 - 以下是我将static final boolean QUICK设置为false时算法将其转换为的内容:

enter image description here

看起来不一样,但仍然不对。

我真的很想让这个算法起作用,因为它快速(呃)并且产生比替代品(NeuQuant)更小的文件。我做的一切是正确的还是算法的运作方式?

2 个答案:

答案 0 :(得分:0)

你需要添加一个抖动算法..谷歌它...我相信Java内置了一些算法,但维基百科的直接Java样本为我工作。因为我想要使用原始字节数组和int数组来获得更高的效率,而不仅仅是使用getPixel / setPixel

答案 1 :(得分:0)

我最终放弃了Quantize.java并找到了Java Imaging Utilities(http://sourceforge.net/projects/jiu/),它提供了一些不错的颜色/图像量化选项。它们不是完美的结果,但是可以忍受。