我有一个从磁盘加载的图像(存储为BufferedImage
),我在JPanel
上正确显示但是当我尝试使用下面的命令重新保存此图像时,图像是以淡红色调保存。
ImageIO.write(image, "jpg", fileName);
请注意!图片为BufferedImage
,fileName
是File
对象,指向将以“.jpg
”结尾保存的文件名。
我已经读过早期JDK中的ImageIO
方法存在问题但是我找不到其中一个版本。我正在寻找的是一种解决这个问题而无需更新JDK的方法,但是我已经说过我仍然想知道这个问题在JDK中修复了什么(如果它确实仍然是我正在使用的JDK的一个bug )。
感谢。
答案 0 :(得分:5)
好的,解决了我的问题,似乎我出于某种原因需要将图像转换为BufferedImage.TYPE_INT_RGB。我认为在某些层可能无法正确处理alpha通道。
答案 1 :(得分:3)
首先,我将首先调查是否是问题或者jpeg编码的BifferedImage颜色模型。您可以尝试更改图像类型(constructor中的第三个参数),以查看是否会产生差异,还可以直接使用JPEGCodec来保存jpeg。
E.g。
BufferedImage bufferedImage = ...; // your image
out = new FileOutputStream ( filename );
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder ( out );
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam ( bufferedImage );
encoder.setJPEGEncodeParam ( param );
encoder.encode ( bufferedImage );
out.close();
编辑:更改了文字,这是您想要更改的图片类型。请参阅构造函数的链接。
答案 2 :(得分:1)
另一种方法是在TYPE_INT_ARGB
缓冲区中渲染图像,具有带alpha的DirectColorModel,如下所述并建议here。
private BufferedImage process(BufferedImage old) {
int w = old.getWidth();
int h = old.getHeight();
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.drawImage(old, 0, 0, null);
g2d.dispose();
return img;
}