getRGB和getRaster带来不同的结果

时间:2015-10-11 08:19:08

标签: java image-processing bufferedimage

如果我以这种方式创建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结果不同?

1 个答案:

答案 0 :(得分:2)

您正在直接向Raster写入像素,但是您需要通过Image API来获取它们。

这些是非常不同的API,Raster使用原始像素数据,而Image API则考虑了ColorModel。当你调用getRGB()时,调用被委托通过 ColorModel,因此可以执行sRGB颜色空间和Raster颜色空间之间的一些nonlinear转换。

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

    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是错误的。