保存jpg图像时,Java 1.5.0_16损坏了颜色

时间:2010-05-02 14:21:39

标签: java image-processing javax.imageio

我有一个从磁盘加载的图像(存储为BufferedImage),我在JPanel上正确显示但是当我尝试使用下面的命令重新保存此图像时,图像是以淡红色调保存。

ImageIO.write(image, "jpg", fileName);

请注意!图片为BufferedImagefileNameFile对象,指向将以“.jpg”结尾保存的文件名。

我已经读过早期JDK中的ImageIO方法存在问题但是我找不到其中一个版本。我正在寻找的是一种解决这个问题而无需更新JDK的方法,但是我已经说过我仍然想知道这个问题在JDK中修复了什么(如果它确实仍然是我正在使用的JDK的一个bug )。

感谢。

3 个答案:

答案 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;
}