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