6

我注意到使用 ImageIO.write 有明显的质量损失,如何禁用自动压缩?

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()
4

3 回答 3

12

使用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);

对于非照片图像,请使用 .png。


正如@PiotrekDe 评论的那样,以下内容似乎更合乎逻辑。

writer.write(null, new IIOImage(image, null, null), param)
于 2013-06-10T01:02:24.467 回答
2

JPEG 压缩是有损的。但是PNG压缩是无损的。所以,我建议用png格式写。这意味着即使您以 PNG 格式压缩也不会损失质量。简单的线条:

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

但是,如果您想要 jpg 格式的质量,请将质量设置为 100%。以下代码可能会对您有所帮助。

    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);
于 2016-02-21T02:23:18.637 回答
0

jpeg 图像使用有损压缩。改用 png 。这也被压缩了,但使用了无损算法。

于 2013-06-10T00:41:09.590 回答