javax.imageio.ImageIO在灰度图像上读取不正确的RGB值

时间:2011-12-20 17:16:46

标签: java image

我有一张图片,称之为grayscale.jpg。现在我在The Gimp中打开该图像并将颜色模式更改为RGB并将其另存为color.jpg。如果我在任何图像查看器中查看grayscale.jpg和color.jpg,它们看起来完全一样。但是如果我用javax.imageio.ImageIO

打开图像
import javax.imageio.ImageIO;

input = ImageIO.read(new File("grayscale.jpg"));
System.out.format("Grayscale value: %x\n", input.getRGB(200, 200));

input = ImageIO.read(new File("color.jpg"));
System.out.format("Color value: %x\n", input.getRGB(200, 200));

彩色图像将返回正确的值,例如0xff6c6c6c。灰度图像将返回不同的,更轻的,不正确的值,如0xffaeaeae。

Grayscale value: 0xffaeaeae // Incorrect (Lighter)
Color value:     0xff6c6c6c // Correct

换句话说,javax.imageio.ImageIO认为灰度图像比实际图像轻得多。如何准确读取灰度图像?

修改

这里有更多背景信息。我的用户上传的图片可能是灰度图像。我的Java在服务器上运行,并进行一些非常复杂的图像处理。因此,理想的解决方案是修复我的Java代码,而不是使用命令行工具将某些内容拼凑起来。

1 个答案:

答案 0 :(得分:-1)

您的测试无关紧要,因为您使用的是JPEG,这是有损的。根据压缩,您可能有其他颜色值。所以,尝试使用PNG,这是无损的。

您可以使用此图片测试javax.imageio的正确性。使用Gimp将此转换为灰度,并确保将其保存为PNG。然后以相同的方式加载(这一个和转换的一个)。并在for循环中比较y轴的所有颜色。

enter image description here

示例代码:

BufferedImage inputGrayscale = ImageIO.read(new File("grayscale.png"));    
BufferedImage inputColor = ImageIO.read(new File("color.png"));

for (int i = 0; i < 256; ++i)
{
    System.out.printf(i + "Grayscale value: %x\n", inputGrayscale.getRGB(10, i));
    System.out.printf(i + "Color value: %x\n", inputColor.getRGB(10, i));
    System.out.println();
}