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的用法,如何读取保存一个图片
IOS设备上传图片,使用ImageIO.write 图片翻转纠正(JAVA)