如果我以这种方式创建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
结果不同?
答案 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是错误的。