【问题标题】:BufferedImage: Red is being displayed as GreyBufferedImage:红色显示为灰色
【发布时间】:2011-12-03 16:03:47
【问题描述】:

我正在用 java 编写一个小程序,它将在图像上绘制路径。为此,我有以下代码

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

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

Color.red.getRGB的返回值为0xFFFF0000。当我将像素设置为红色后对像素执行 getRGB 时,我得到了 0xFF7F7F7F。

我对 Java 比较陌生,不知道为什么会这样。任何帮助将不胜感激。

如果有区别,则图像来自 .bmp 文件。

【问题讨论】:

    标签: java bufferedimage


    【解决方案1】:

    您可能正在使用灰度类型的 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。这是对该主题的一个很好的介绍。

    【讨论】:

    • 优秀的深思熟虑的答案!谢谢,+1!
    • 感谢您的精彩回答!那是我的问题。我检查了类型的值,它给了我 10,恰好是 TYPE_BYTE_GRAY。你知道我如何自己设置这个值吗?我查看了您在底部添加的链接,但它没有说明类型值(除了自己制作 BufferedImage 时,我不知道该怎么做。我目前正在使用 ImageIO.read)
    • 很高兴有帮助。关于如何自己构建图像的方法,请参阅我的答案中的第一个链接。此外,Java2D 教程在“使用图像”的最后两个小节中确实包含了对该主题的更深入的介绍——它向您展示了如何创建一个空图像,然后在其上绘制一个加载的图像。如果您想坚持使用 ImageIO.read(),目前最简单的解决方案是在您喜欢的图像编辑器中打开文件并将其保存为彩色 BMP。否则,我真的建议好好阅读本教程:)。
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多