Java ImageIO.write() 在保存期间更改质量

Posted

技术标签:

【中文标题】Java ImageIO.write() 在保存期间更改质量【英文标题】:Java ImagIO.write() changes quality during save 【发布时间】:2013-05-04 01:34:22 【问题描述】:

我正在编写一个有趣的图像库,但遇到了一个我似乎无法解决的问题。这个类非常简单:拍照,处理,通过 JFrame 显示,最后保存为 BufferedImage (javax.imageio.ImageIO)。这是我的照片通过 JFrame 的样子(这是我在 Drustan 星云上的 ColorEnhance 课程):

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

我不确定变化发生在哪里,但是当我通过我的模糊方法运行它时,整行出现在 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);

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

【问题讨论】:

我增加了您的代表,发布必要的图片以便更好地理解问题。 那些代码 sn-ps 甚至没有指出正在使用的图像类型!为了尽快获得更好的帮助,请发帖SSCCE。 好的,谢谢 Andrew,我想我应该更清楚一点,我用尽了 ImageIO.write() 支持的所有图像类型,每次都得到相同的结果。我忽略了发布其余代码,因为我知道错误出在 ImageIO 或 BufferedImage 交互中的某个地方(我对它们不太熟悉)。如果找不到修复程序,我可以忍受它并以某种方式解决它的意大利面修补程序...底线:有什么方法可以使我保存的文件看起来与通过 JFrame 的输出完全相同? 您是否尝试过不应用任何过滤器直接保存图像?我相信ImageIO不是原因,一定是你的错ImageFilter 是的,并且工作正常。至于我的过滤器(ColorEnhance 类),它在 JFrame 中看起来很棒,所以我只能假设它可以正常工作。如果我打印出我的 BufferedImage 的 RGB,目测它,它似乎与 JFrame 匹配比 png 更正确。这就是我所知道的。 【参考方案1】:

尝试使用来自Apache XML Graphics Commons 的PNGImageEncoder

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

【讨论】:

以上是关于Java ImageIO.write() 在保存期间更改质量的主要内容,如果未能解决你的问题,请参考以下文章

Java中BufferedImage的用法,如何读取保存一个图片

ImageIO.write bmp 不起作用

imageio.write的参数

IOS设备上传图片,使用ImageIO.write 图片翻转纠正(JAVA)

使用 Qt 解码使用 Java ImageIO 类编码的图像

java jpg 像素编辑