getRGB 和 getRaster 带来不同的结果

getRGB and getRaster brings different results

如果我以这种方式创建 BufferedImage

    BufferedImage image = new BufferedImage(4, 3, BufferedImage.TYPE_BYTE_GRAY);
    image.getRaster().setPixels(0, 0, image.getWidth(), image.getHeight(), new int[]
                    {
                            0, 255, 192, 183,
                            83, 143, 52, 128,
                            102, 239, 34, 1
                    }
    );

然后当使用getRGB方法获取像素值时:

    for (int y = 0; y < image.getHeight(); y++) {
        for (int x = 0; x < image.getWidth(); x++) {
            System.out.print((image.getRGB(x, y)) & 0xFF);
            System.out.print(" ");
        }
        System.out.println();
    }

我看到与输入不同的结果:

0 255 225 220 
155 197 125 188 
170 248 102 13 

我可以使用 image.getRaster().getDataBuffer() 获得原始值,但为什么 getRGB 结果不同?

您直接将像素写入光栅,但您通过图像 API 将它们取回。

这些非常不同 API,Raster 使用 raw 像素数据,而 Image API 考虑了 ColorModel。当您调用 getRGB() 时,调用被委托 通过 ColorModel,因此一些 nonlinear sRGB 颜色 space 和光栅颜色 space 之间的转换]可以be/is执行。

如果您尝试将它们向后转换:

    for (int y = 0; y < image.getHeight(); y++) {
        for (int x = 0; x < image.getWidth(); x++) {
            int rgb = image.getRGB(x, y);
            image.setRGB(x, y, rgb);
        }
    }

Raster 数据中,您将看到与原始结果非常接近的结果:

0 255 192 183 
84 142 52 128 
103 239 34 1

所以一切都是正确的,只是假设8位灰度线性转换为sRGB是错误的。