这不是一个重复的问题,因为我已经在Google和StackOverflow中寻找解决方案很长时间了,但仍然找不到解决方案。
我有这两张图片:
这是来自同一网站的两张图像,具有相同的前缀和相同的格式。唯一的区别是尺寸:第一个较大,而第二个较小。
我将这两个图像下载到本地文件夹并使用 Java 将它们读入 BufferedImage 对象。然而,当我将BufferedImages输出到本地文件时,我发现第一个图像几乎是红色的,而第二个图像是正常的(与原始图像相同)。我的代码有什么问题吗?
byte[] rawData = getRawBytesFromFile(imageFilePath); // some code to read raw bytes from image file
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(rawData));
BufferedImage img = ImageIO.read(iis);
FileOutputStream fos = new FileOutputStream(outputImagePath, false);
ImageIO.write(img, "JPEG", fos);
fos.flush();
fos.close();
PS:我使用 GIMP 打开第一张图像,发现颜色模式是“sRGB”,没有 alpha 或其他东西。
这显然是一个已知的错误,我看到了几个建议(this https://stackoverflow.com/questions/12963685/java-buffered-image-created-with-red-mask是之一)建议使用Toolkit#createImage
相反,这显然忽略了颜色模型。
我对此进行了测试,似乎工作正常。
public class TestImageIO01 {
public static void main(String[] args) {
try {
Image in = Toolkit.getDefaultToolkit().createImage("C:\\hold\\test\\13652375852388.jpg");
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(in)), "Yeah", JOptionPane.INFORMATION_MESSAGE);
BufferedImage out = new BufferedImage(in.getWidth(null), in.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = out.createGraphics();
g2d.drawImage(in, 0, 0, null);
g2d.dispose();
ImageIO.write(out, "jpg", new File("C:\\hold\\test\\Test01.jpg"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
注意-我用过JOptionPane
验证传入的图像。使用时ImageIO
它带有红色调,Toolkit
看起来不错。
Updated
And an 外植 http://blog.idrsolutions.com/2009/04/odd-coloured-jpegs-in-java-with-imageio/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)