Java ImagIO.write() 在保存时会改变图像质量

5
我正在编写一个有趣的图像库,但遇到了一个似乎无法解决的问题。该类非常简单:拍照、处理照片、通过JFrame显示照片,最后将其保存为BufferedImage(javax.imageio.ImageIO)。这是我通过JFrame看到的图片(这是我的ColorEnhance类...在Drustan星云中):The image as seen from the JFrame 这是保存后的版本(png格式,但ImageIO.write()支持的所有类型看起来都一样):The image as seen after it has been saved 我不确定变化发生在哪里,但当我通过模糊方法运行它时,整条线从png中突然出现...无论如何,这是一些代码:
public void writeToFile(BufferedImage finalPic, String nameToAppend)
{
    String temp=fileName.replace(".", nameToAppend+".");
    String ext=fileName.substring(fileName.indexOf(".")+1);
    File file=new File(temp);
    try
    {
        ImageIO.write(finalPic, ext.toUpperCase(), file);
        System.out.println("Successfully saved to: "+temp);
    } catch (Exception e) { e.getMessage(); }
}

public void displayImage(String titleName)
{
    ImageIcon icon = new ImageIcon(newPic);
    JFrame frame = new JFrame(titleName);
    JLabel label = new JLabel(icon);
    label.setIcon(icon);
    frame.getContentPane().add(label, BorderLayout.CENTER);
    frame.setSize(WIDTH, HEIGHT+22);
    frame.setVisible(true);
}

最后一点是,保存功能对于某些处理类比其他处理类更有效。如果您需要查看更多代码,请随时提问,谢谢。


这些代码片段甚至没有表明使用了哪种图像类型!为了更快获得更好的帮助,请发布SSCCE - Andrew Thompson
好的,谢谢Andrew,我想我应该更清楚地表明我已经用ImageIO.write()支持的所有图像类型尝试过了,每次都得到相同的结果。我忽略了发布其余代码的原因,因为我知道错误在ImageIO或BufferedImage交互中(我对它们不太熟悉)。如果找不到解决方法,我可以接受并绕过它...底线是:有没有办法使我的保存文件看起来与JFrame输出完全相同? - JFakult
你尝试过直接保存图像而不应用任何滤镜吗?我相信 ImageIO 不是问题的原因,一定是你有问题的 ImageFilter - Extreme Coders
是的,而且运作得很好。至于我的过滤器(ColorEnhance类),它在JFrame中看起来很棒,所以我只能假设它工作正常。如果我打印出我的BufferedImage的RGB值,并用肉眼观察它,似乎与JFrame更匹配,而不是PNG。这就是我知道的全部。 - JFakult
有没有一种方法可以将颜色涂在图片上并导出呢?即使运行时间更长,我也会比现在更开心。 - JFakult
显示剩余3条评论
1个回答

1
尝试使用来自Apache XML Graphics CommonsPNGImageEncoder
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
PNGImageEncoder encoder = new PNGImageEncoder(new FileOutputStream("file.png"), null);
encoder.encode((RenderedImage) image);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接