我一直在javax.imageio.ImageIO中使用ImageIO.read()和ImageIO.write()方法读取和写入图像,我发现某些图像的颜色发生了奇怪的变化。

即使我更改代码以仅读取图像并写入图像(使用jpeg,png,gif)也不做任何事情,所有这些新图像也存在相同的问题。

我需要在ImageIO.read/write方法之前/之后添加其他代码吗?

这是我使用的代码:

    File f = new File("obw.jpg");
    BufferedImage bi = ImageIO.read(f);
    FileOutputStream fos2 = new FileOutputStream("obw2.jpg");
    ImageIO.write(bi, "JPG", fos2);
    FileOutputStream fos3 = new FileOutputStream("obw3.gif");
    ImageIO.write(bi, "GIF", fos3);
    FileOutputStream fos4 = new FileOutputStream("obw4.png");
    ImageIO.write(bi, "PNG", fos4);

我的环境:
    java version "1.6.0_35"
    MacOSX 10.8.2

原始图片:

读写后的图像之一:

最佳答案

您的问题是ImageIO将JPEG中的YCbCr数据误解为RBG数据。相关的Java错误是47127974776576,Oracle错误地宣称Java错误已在Java 1.4中修复,但实际上仍然困扰着某些Java 5、6和7 JVM。

在我从事的项目中,我们通过加载特殊构建的test JPEG with a single black pixel来解决此问题,以查看ImageIO是否正确加载了它。如果像素变为绿色,则ImageIO会误解图像数据,因此,当我们稍后加载JPEG并检测到导致问题的JPEG种类时,我们还将应用颜色校正。 (在JVM中触发该问题的JPEG类型,显示出它具有特定类型的子采样并且没有JFIF标记。)

这是一些解决问题的LGPLv2-licensed code。当全世界其他地方都设法正确加载JPEG时,需要这样的代码来解决12年前的错误,这是我希望Java死机的原因之一。

关于java - 仅在ImageIO.read()和ImageIO.write()之后,jpeg图像颜色就会发生巨大变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13072312/

10-13 03:35