我有一张图片,称之为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代码,而不是使用命令行工具将某些内容拼凑起来。
答案 0 :(得分:-1)
您的测试无关紧要,因为您使用的是JPEG,这是有损的。根据压缩,您可能有其他颜色值。所以,尝试使用PNG,这是无损的。
您可以使用此图片测试javax.imageio
的正确性。使用Gimp将此转换为灰度,并确保将其保存为PNG。然后以相同的方式加载(这一个和转换的一个)。并在for循环中比较y轴的所有颜色。
示例代码:
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();
}