gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:55 28 4
gpt4 key购买 nike

我有一张图片,称之为 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 代码,而不是使用命令行工具将某些东西拼凑在一起。

最佳答案

您的测试无关紧要,因为您使用的是有损的 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();
}

关于javax.imageio.ImageIO 在灰度图像上读取不正确的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579296/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com