4

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

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

笔记!image 是一个BufferedImage并且fileName是一个File指向要保存的以“ .jpg”结尾的文件名的对象。

我已经读到ImageIO早期 JDK 中的方法存在问题,但据我所知,我不在其中一个版本上。我正在寻找的是一种在不更新 JDK 的情况下解决这个问题的方法,但是我说我仍然想知道这个问题是在什么 JDK 中修复的(如果它确实仍然是我正在使用的 JDK 的一个错误) )。

谢谢。

4

3 回答 3

5

好的,解决了我的问题,似乎出于某种原因我需要将图像转换为 BufferedImage.TYPE_INT_RGB。我认为在某些层可能无法正确处理 alpha 通道。

于 2010-05-02T18:04:46.480 回答
3

我首先会调查问题是 BifferedImage 颜色模型还是 jpeg 编码。您可以尝试更改图像类型(构造函数中的第三个参数),看看是否会产生差异,并且还可以直接使用 JPEGCodec 来保存 jpeg。

例如

 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();

编辑:更改文本,这是您要更改的图像类型。请参阅构造函数的链接。

于 2010-05-02T14:26:58.713 回答
1

另一种方法是在TYPE_INT_ARGB缓冲区中渲染图像,具有带 alpha 的 DirectColorModel,如下所述并在此处建议。

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;
}
于 2010-05-02T15:43:27.003 回答