使用ImageIO.write的质量损失

Roc*_*och 5 jpeg bufferedimage scala image

我已经注意到使用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()
Run Code Online (Sandbox Code Playgroud)

Joo*_*gen 10

使用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);
Run Code Online (Sandbox Code Playgroud)

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


正如@PiotrekDe评论的那样,以下似乎更符合逻辑.

writer.write(null, new IIOImage(image, null, null), param)
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要将`param`传递回`writer`,如:`writer.write(null,new IIOImage(image,null,null),param)` (2认同)