gpt4 book ai didi

java - getRGB 和 getRaster 带来不同的结果

转载 作者:行者123 更新时间:2023-12-02 04:18:14 27 4
gpt4 key购买 nike

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

最佳答案

您直接将像素写入 Raster,但需要通过 Image API 将它们取回。

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

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

    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

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

关于java - getRGB 和 getRaster 带来不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com