【问题标题】:Color quantizing giving very bad results?颜色量化给出了非常糟糕的结果?
【发布时间】:2015-06-01 08:07:15
【问题描述】:

我正在尝试让我的应用程序导出动画 gif,但是,一旦颜色超过 256,量化算法就会启动,事情就会出错。

这是我正在转换的文件,以及算法将其转换为什么:

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

我是这样使用的:

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 时,算法将其转换为以下内容:

看起来不一样,但还是不对。

我真的很想让这个算法发挥作用,因为它比替代方案 (NeuQuant) 速度快(呃)并且生成的文件更小。我做的一切都是正确的还是这就是算法的工作原理?

【问题讨论】:

  • 您希望indexedPixels[i++] = (byte) pixels[x][y]; 行做什么?
  • @DouglasZare colorPalette = Quantize.quantizeImage(pixels, 256); 行将像素[][] 的内容转换为 colorMap[] 的索引,本质上将每个像素指向 colorMap[] 中的一种颜色。您引用的行我只是将它从 2D 数组清空到 1D 字节数组中,因为这是我正在使用的 LZWEncoder 所期望的。
  • 哇,这是 quantizeImage 的副作用。通过colorMap [],您的意思是colorPalette?您是否确保撤消从 int 到 byte 的每个索引的转换,而不是简单地将其转换回 int?例如,颜色编号 200(作为 int)变为 -56(作为字节)。
  • @DouglasZare Man 这似乎是一个很好的答案。我刚刚尝试过(一起摆脱了字节,只使用整数),但结果完全相同。 indexedPixels[] 数组现在看起来更正确了,没有负数,内容从 0 到 255。

标签: java algorithm imagemagick gif quantization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要添加抖动算法.. google it.. 我相信 Java 内置了一些算法,但是来自维基百科的直接 Java 示例对我有用。因为我想使用原始字节数组和整数数组来获得比仅使用 getPixel/setPixel 更高的效率

    【讨论】:

    • 我还没有尝试过,但是抖动算法会阻止图像变红(如 OP 中的第一个示例)?这似乎不对。我使用的 Quantize 算法似乎是错误的,因为 NeuQuant 确实足够准确,但是文件大小为 3 倍时慢了 5 倍。
    猜你喜欢
    • 2021-05-29
    • 2016-10-09
    • 2015-04-08
    • 1970-01-01
    • 2020-06-15
    • 2018-04-27
    • 1970-01-01
    • 2012-05-06
    • 2014-06-30
    相关资源
    最近更新 更多