【发布时间】:2012-01-24 15:26:57
【问题描述】:
我有一张图片,叫它 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 代码,而不是用命令行工具拼凑一些东西。
【问题讨论】:
-
经过更多挖掘,这是stackoverflow.com/questions/6474753/…的副本
-
刚刚确认这个错误在 2019 年的 Java 8.181 中仍然存在。BufferedImage.getRGB 在使用 BufferedImage.getRaster() 时对灰度字节应用了一个奇怪的变换,使其亮度提高了 30%。 getPixel() 返回正确的颜色。