Quality loss using ImageIO.write

删除回忆录丶 提交于 2019-12-17 16:48:28

问题


I have noticied significant quality loss using ImageIO.write, how I can disable automatic compression ?

val baos: ByteArrayOutputStream = new ByteArrayOutputStream
val newBi = new BufferedImage(img.getWidth, img.getHeight, BufferedImage.TYPE_INT_RGB)
val gr = newBi.createGraphics()
gr.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), Color.WHITE, null)
ImageIO.write(newBi, "jpeg", baos)
val b = baos.toByteArray
baos.close()

回答1:


Use ImageWriter.

ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // Needed see javadoc
param.setCompressionQuality(1.0F); // Highest quality
writer.write(image);

For non-photo images use .png.


As @PiotrekDe commented, the following seems more logical.

writer.write(null, new IIOImage(image, null, null), param)



回答2:


In Scala, using https://github.com/sksamuel/scrimage you can set the compression level on jpegs

val in = // some input stream or byte array
val out = // some output stream etc
Image(in).writer(Format.JPEG).withCompression(1.0).write(out)

You can set any value between 0 and 1.0 for the compression level.




回答3:


jpeg images are using lossy compression. Use png instead. That's compressed too but with a lossless algorithm.




回答4:


JPEG Cmpression is lossy. But PNG compression is lossless. So, i suggest to write in png format. That means you won't loss quality even if you compress in PNG format. Simple lines:

ImageIO.write(newBI,"png",someOutputStream);

But, if you want it in jpg format with quality, set Quality to 100%. The following code may help you.

    ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
    ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
    jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    jpgWriteParam.setCompressionQuality(1f);
    jpgWriter.setOutput(someOutputStream);
     //better to use ImageOutputStream
    jpgWriter.write(null,new IIOImage(yourImage, null, null), jpgWriteParam);


来源:https://stackoverflow.com/questions/17015197/quality-loss-using-imageio-write

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!