BufferedImage:红色显示为灰色

问题描述:

我正在用Java编写一个小程序,它将在图像上绘制路径。要做到这一点,我有以下代码BufferedImage:红色显示为灰色

while(!path.isEmpty()) 
{ 
    Position p = path.poll(); 
    image.setRGB(p.getX(),p.getY(),Color.red.getRGB()); 
} 

在哪里路径是一个对象的队列,其旧的X和Y坐标和图像是一个标准的BufferedImage(来自ImageIO.read)。此代码仅用于在队列中的图像的每个像素上绘制一个红色像素。当我将这个图像写入文件时,我得到了一个灰色,而不是红色。

The diagonal gray line SHOULD be Red...

Color.red.getRGB的返回值是0xFFFF0000地址。当我将它设置为红色后,在像素上执行getRGB时,返回0xFF7F7F7F。

我是比较新的Java和不知道为什么会这样。任何帮助将不胜感激。

如果它的确与众不同,图像是从一个.bmp文件。

这可能是你使用一个BufferedImage,这是一个灰度类型,或那些sRGB值映射到的灰色的类型。

一般情况下,有两种可能性之一:

  1. 如果你明确初始化的BufferedImage退房要么IMAGETYPE或ColorModel的参数,depending on the constructor you're using
  2. 如果你通过一些工厂方法或以其他方式间接初始化图像对象,检查出的getType()方法的价值。这些值在JavaDoc中列出。如果这是一个“正确的”值(RGB类型之一),请检查返回的getColorModel()

由于您从.bmp文件加载图像,第二个可能是您的情况。

有关色彩值转换问题的信息,请参阅herehere

一般来说,如果您只是想了解Java中的图像处理,我会建议使用第二个带* TYPE_INT_ARGB *的BufferedImage构造函数作为初学者的类型,并从中扩展您的代码。从我记得我早期的Java时代,学习图像加载可能有点棘手:)。

此外,您可能想读official Java2D tutorial。这是一个很好的介绍这个话题。

+0

非常周到的答案!感谢和+1! –

+0

感谢您的好评!这是我的问题。我检查了类型的值,它给了我10,这恰好是TYPE_BYTE_GRAY。你知道我可以自己设定这个值吗?我查看了你在底部添加的链接,但没有提及任何关于类型值的内容(除了自己制作BufferedImage,我不知道该怎么做,我正在使用ImageIO.read) –

+0

很高兴这有帮助。关于如何自己构建图像的方法,请参阅我答案中的第一个链接。另外,Java2D教程在“使用图像”的最后两个小节中确实包含了有关此主题的更深入报道 - 它向您展示了如何创建一个空的图像,然后在其上绘制一个加载的图像。 如果你想坚持使用ImageIO。read(),现在最简单的解决方案是在您最喜欢的图像编辑器中打开文件并将其保存为彩色BMP。 否则,我真的建议给教程一个很好的阅读:)。 –