繁体   English   中英

无法将JPEG压缩与ImageIO配合使用

[英]Can't get JPEG compression to work with ImageIO

我编写了一个测试,以查看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);
        }
    }
}

您必须使用不同的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();

将ImageParams传递到ImageWriter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM