Не удается получить сжатие JPEG для работы с 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);
}
}
}
2 ответа:
Вы должны использовать другую перегрузку
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();