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是错误的。
如果我以这种方式创建 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是错误的。