java - BufferedImage 不一致的行为

标签 java image image-processing awt bufferedimage

在我使用 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 颜色空间 (ColorSpace.CS_sRGB)。它会这样做,不管你的图像有什么颜色空间和每像素位数等。因此,可能会发生转换和可能的精度损失。

来自JavaDoc :

Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel.

您的TYPE_BYTE_GRAY 图像在内部使用线性 灰色色彩空间 (ColorSpace.CS_GRAY),它不会与sRGB。

此外,我建议对 (A)RGB 颜色使用十六进制表示法,这样可以更容易地看到颜色和差异:

-16711423 == 0xff010101
-16777216 == 0xff000000

因此,这里有轻微的精度损失,但没有意外。

如果您想直接访问像素数据,请查看 RasterSampleModelDataBuffer 类(及其各自的子类)。

关于java - BufferedImage 不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889681/

相关文章:

java - 使用 Android (ndk) 在 C++ 中打开和读取文本文件

java - 如何在多个类中抽象出具有不同返回类型的相同方法

java - 仅搜索并更改二维数组中的 1 个数字

java - 使用 Java 代码将图像下载到本地计算机时图像分辨率会降低

Java SWT : Getting original X/Y Coordinates from Scaled Image

java - 我应该使用嵌套类来封装 map 值吗?

html - 在 <image> 标签后面重定向图像有什么影响?

android - 从 Android 应用程序向 whatsapp 发送消息

css - 使用 SVG 滤镜的着色单调图像

python - 从图表中提取绘图线