Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 getRGB和getRaster带来不同的结果_Java_Image Processing_Bufferedimage - Fatal编程技术网

Java getRGB和getRaster带来不同的结果

Java getRGB和getRaster带来不同的结果,java,image-processing,bufferedimage,Java,Image Processing,Bufferedimage,如果我以这种方式创建一个buffereImage: BufferedImage image = new BufferedImage(4, 3, BufferedImage.TYPE_BYTE_GRAY); image.getRaster().setPixels(0, 0, image.getWidth(), image.getHeight(), new int[] { 0, 255,

如果我以这种方式创建一个
buffereImage

    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();
    }

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

您直接将像素写入光栅,但要通过图像API将其取回

这些API非常不同,光栅处理原始像素数据,而图像API考虑了ColorModel。调用getRGB()时,调用将通过ColorModel委派,因此可以执行sRGB颜色空间和光栅颜色空间之间的一些转换

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

    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);
        }
    }

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

但实际上,8位灰度图像必须适合32位ARGB,而不会丢失精度。但是转换后,
34
变成
102
会发生什么?这很奇怪,一定有更理智的解释。。。因为在这种情况下,
getRGB
似乎是无用的。@imk 1如果您想要与传入的值相同,
getRGB
是无用的(除非您的输入值和目标图像恰好已经在sRGB颜色空间中)。与其说是“失去精度”,还不如说是颜色空间转换会改变值(在您的情况下,从线性灰色到sRGB)。@imk imk imk 1070imk 0909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909。您正在为像素数据应用一个简化模型,该模型仅适用于所有内容都位于同一颜色空间中的情况。
    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);
        }
    }
0 255 192 183 
84 142 52 128 
103 239 34 1