【问题标题】:Quality loss using ImageIO.write使用 ImageIO.write 的质量损失
【发布时间】:2013-06-09 23:30:45
【问题描述】:

我注意到使用 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()

【问题讨论】:

    标签: image scala jpeg bufferedimage


    【解决方案1】:

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

    【讨论】:

    • 我已经尝试过这些方法,但由于某些原因,输出图像被黑色填充。你知道它可能来自哪里吗?
    • 抱歉,我知道这些方法(而且 png 很慢),但总的来说我选择 png。
    • 我觉得你需要把param传回writer,比如:writer.write(null, new IIOImage(image, null, null), param)
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多