在我使用 setRGB 将 java.awt.image.BufferedImage 的像素设置为一个值后,对 getRGB 的后续调用返回的值与我设置的值不同。
代码:
BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY);
int color1 = -16711423; // corresponds to RGB(1, 1, 1)
image.setRGB(0, 0, color1);
int color2 = image.getRGB(0, 0);
System.out.println(color1);
System.out.println(color2);
它产生以下输出
-16711423
-16777216
我认为它必须对 Gamma 校正做一些事情,但我在文档中找不到任何关于它的信息。
理想情况下,我想更改此行为以返回与我设置的值相同的值。那可能吗?
最佳答案
BufferedImage.getRGB()
方法始终返回非线性 sRGB 颜色空间 ( int
) 中的颜色(作为“打包格式”的 ColorSpace.CS_sRGB
)。无论您的图像具有什么颜色空间和每像素位数等,它都会这样做。因此,可能会发生转换和可能的精度损失。
从 JavaDoc :
您的 TYPE_BYTE_GRAY
图像在内部使用线性灰色颜色空间 ( ColorSpace.CS_GRAY
),它不会与 sRGB 一对一映射。
另外,我建议对 (A)RGB 颜色使用十六进制表示法,它使颜色和差异更容易看到:
-16711423 == 0xff010101
-16777216 == 0xff000000
所以,这里有一个小的精度损失,但没有什么意外。
如果您想直接访问像素数据,请查看
Raster
、 SampleModel
和 DataBuffer
类(及其各自的子类)。关于java - BufferedImage 不一致的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25889681/