我一直在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错误是4712797和4776576,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/