Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 颜色量化会产生非常糟糕的结果吗?_Java_Algorithm_Imagemagick_Gif_Quantization - Fatal编程技术网

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

Java 颜色量化会产生非常糟糕的结果吗?,java,algorithm,imagemagick,gif,quantization,Java,Algorithm,Imagemagick,Gif,Quantization,我正试图让我的应用程序导出动画GIF,但是,一旦颜色超过256,量化算法就会启动,事情就错了 以下是我正在转换的文件,以及算法将其转换为的内容: 我使用的量化算法,它显然是ImageMagick中使用的量化的Java端口,所以我觉得它应该是可靠的 我是这样使用它的: protected int[][] pixels; // 2D array of RGB pixels of image protected byte[] indexedPixels; // ... /** * Analy

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

以下是我正在转换的文件,以及算法将其转换为的内容:

我使用的量化算法,它显然是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];
    }
}
受保护的int[][]像素;//图像的RGB像素的2D阵列
受保护字节[]索引像素;
// ...
/**
*分析图像颜色并创建颜色贴图。
*/
受保护的无效分析像素()
{
//量化像素,得到缩小的颜色映射和索引数组。
// -------------------------------------------------------------
颜色调色板=量化。量化图像(像素,256);
//创建索引像素数组。
// ----------------------------
int i=0;
对于(int x=0,xSize=pixels.length;x
注意-当我将
静态最终布尔值QUICK
设置为
false
时,算法将其转换为:

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


我真的很想让这个算法发挥作用,因为它比其他算法(NeuQuant)速度快(er),生成的文件也更小。我做的一切都对吗?还是这就是算法的工作原理?

您需要添加一个抖动算法。。用谷歌搜索。。我相信Java内置了一些算法,但维基百科上的一个简单Java示例对我很有用。由于我想使用原始字节数组和int数组来获得比使用getPixel/setPixel更高的效率,我最终放弃了Quantize.java,找到了java Imaging Utilities(),它提供了一些不错的颜色/图像量化选项。它们不是完美的结果,但可以接受。

你对这行的期望是什么
indexedPixels[i++]=(字节)像素[x][y]要做什么?@DouglasZare行
colorplate=Quantize.quantizeImage(像素,256)将像素[]的内容转换为colorMap[]的索引,基本上将每个像素指向colorMap[]中的一种颜色。你提到的那行,我只是把它从一个2D数组清空成一个1D字节数组,因为这是我正在使用的LZWEncoder所期望的。哇,这是quantizeImage的一个副作用。您所说的colorMap[],是指colorPalette?您是否确保撤消每个索引从int到byte的转换,而不是简单地将其转换回int?例如,颜色数字200(整数)变成-56(字节)。@DouglasZare-Man这似乎是一个很好的答案。我只是尝试了一下(去掉了所有字节,只保留了整数),但结果完全一样。indexedPixels[]数组现在看起来更正确了,没有负数和0-255之间的内容。我没有尝试过这个,但是抖动算法可以防止图像变红(如OP中的第一个示例)?这似乎不对。看起来我使用的量化算法是错误的,因为NeuQuant确实可以足够精确地工作,但是使用3倍的文件大小,速度要慢5倍。