关于图像:Java ImageIO.write()在保存期间更改质量

Java ImagIO.write() changes quality during save

我在编写图像库很有趣,但遇到了一个似乎无法解决的问题。 该类非常简单:拍摄一张图片,对其进行处理,通过JFrame进行显示,最后将其另存为BufferedImage(javax.imageio.ImageIO)。 这是我通过JFrame看到的图片(这是我在Drustan星云上的ColorEnhance类...):

The image as seen from the JFrame

这是保存的版本(一个png,但是ImageIO.write()支持的所有类型都一样):

The image as seen after it has been saved

我不确定更改发生在哪里,但是当我通过我的模糊方法运行时,整个行在png中什么都没有出现...总之,这是一些代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
}

最后一件事是,对于某些处理类,保存效果要好于其他处理类,如果您需要查看更多代码,请询问,谢谢


尝试从Apache XML Graphics Commons使用PNGImageEncoder

1
2
3
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
PNGImageEncoder encoder = new PNGImageEncoder(new FileOutputStream("file.png"), null);
encoder.encode((RenderedImage) image);