【问题标题】:Can't get JPEG compression to work with ImageIO无法使 JPEG 压缩与 ImageIO 一起使用
【发布时间】:2014-08-21 08:37:17
【问题描述】:

我编写了一个测试来查看 setCompressionQuality() 如何影响文件大小和质量。但是,创建的所有文件的大小都相同,这表明我可能做错了什么。我已经在网上查看了许多关于如何执行此操作的指南以及有关 stackoverflow 的其他问题,但我仍然无法发现我的错误。有任何想法吗。 SSCCE 下面。

背景:我为什么要使用 JPEG 来截屏!!?是的,我意识到 PNG 是这项工作的工具,但我正在尝试在通过低带宽链接运行的自定义内部远程桌面解决方案上实现“低质量”模式,只要质量真的无关紧要用户可以看到发生了什么。

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

public class ImageCompressionJpg {
    public static void main(String[] args) throws AWTException, IOException {
        Robot robot = new Robot();

        BufferedImage image = robot.createScreenCapture(new Rectangle(Toolkit
                .getDefaultToolkit().getScreenSize()));

        ImageIO.write(image, "jpg", new File("screen.standard.jpg"));

        // JPEGs, different qualities 0 - 1
        for (float quality = 0; quality <= 1; quality += 0.2) {
            ImageWriter writer = (ImageWriter) ImageIO
                    .getImageWritersByFormatName("jpeg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();

            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);
            ImageOutputStream ios = ImageIO.createImageOutputStream(new File(
                    String.format("screen.%.1f.jpg", quality)));
            writer.setOutput(ios);

            writer.write(image);
        }
    }
}

【问题讨论】:

    标签: java bufferedimage javax.imageio


    【解决方案1】:

    您必须使用不同的write() 重载并将IIOImage 和您的自定义参数传递给它:

    ImageWriter writer  = ImageIO.getImageWritersByFormatName("jpg").next();
    ImageWriteParam param = writer.getDefaultWriteParam();
    
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(quality);
    
    writer.setOutput(new FileImageOutputStream(
        new File(String.format("screen.%.1f.jpg", quality))));
    writer.write(null, new IIOImage(image, null, null), param);
    writer.dispose();
    

    【讨论】:

      【解决方案2】:

      将 ImageParams 传递给 ImageWriter

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 2011-05-09
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        相关资源
        最近更新 更多