【问题标题】:BufferedImage inconsistent behaviorBufferedImage 不一致的行为
【发布时间】:2014-11-11 10:29:41
【问题描述】:

在我使用 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

我认为它必须与伽玛校正有关,但我在文档中找不到任何相关内容。

理想情况下,我想更改此行为以返回与我设置的值相同的值。这可能吗?

【问题讨论】:

    标签: java image image-processing awt bufferedimage


    【解决方案1】:

    BufferedImage.getRGB() 方法总是在 非线性 sRGB 颜色空间 (@987654324 @)。无论您的图像具有什么色彩空间和每像素位数等,它都会这样做。因此,可能会发生转换和可能的精度损失。

    来自JavaDoc

    返回默认 RGB 颜色模型 (TYPE_INT_ARGB) 和默认 sRGB 颜色空间中的整数像素。如果此默认模型与图像 ColorModel 不匹配,则会发生颜色转换。

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

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

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

    所以,这里有轻微的精度损失,但没有什么意外。

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

    【讨论】:

      【解决方案2】:

      您设置了使用int 指定的颜色,它将 RGB 分量存储为字节(在 0..255 的范围内)。

      但是您图像的颜色模型不是 RGB 而是BYTE_GRAY。显然,您可能会遭受精度损失。这解释了不同的颜色。如果您使用图像类型TYPE_INT_RGB,您最终会得到相同的颜色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 2011-03-19
        • 2012-05-15
        • 2013-08-21
        • 2011-03-29
        • 2015-12-15
        • 1970-01-01
        相关资源
        最近更新 更多