使用Java中的ImageIO设置jpg压缩级别 [英] Setting jpg compression level with ImageIO in Java
问题描述
我正在使用 javax.imageio.ImageIO
将 BufferedImage
保存为jpeg文件。
特别是,我创建了以下Java函数:
I'm using javax.imageio.ImageIO
to save a BufferedImage
as a jpeg file.
In particular, I created the following Java function:
public static void getScreenShot(BufferedImage capture, Path folder, String filename) {
try {
ImageIO.write(capture, "jpeg", new File(folder.toString()+"/"+filename+".jpg"));
} catch (AWTException | IOException ex) {
Logger.getLogger(ScreenShotMaker.class.getName()).log(Level.SEVERE, null, ex);
}
}
同样任何图像处理软件,我希望改变jpeg文件的压缩级别。但是,我正在搜索 ImageIO
中似乎缺少的这个选项。
Likewise any image manipulation software, I wish to change the compression level of the jpeg file. However, I'm searching for this option that seems to be missing in ImageIO
.
我可以设置压缩级别以及如何设置?
Can I set the compression level and how?
推荐答案
你必须使用 JPEGImageWriteParam
然后使用 ImageWriter.write()
。在编写之前,通过 ImageWriter.setOutput
。
You have to use JPEGImageWriteParam
and then save the image with ImageWriter.write()
. Before to write, set the output via ImageWriter.setOutput
.
设置压缩级别如下:
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null);
jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(1f);
其中 1f
是一个浮点数100%的质量。如果我不记得错误,默认值约70%。
Where 1f
is a float number that stands for 100% quality. Default value is around 70% if I don't remember wrong.
编辑
然后,您必须按照以下步骤获取 ImageWriter
的实例。有两种方式,短期和长期(我保留两种方式,以防万一)。
Then, you have to do as follows to get an instance of an ImageWriter
. There are two ways, a short and a long one (I keep both, just in case).
短路(由<建议一条评论中的href =https://stackoverflow.com/users/166524/lapo> lapo 是:
final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
// specifies where the jpg image has to be written
writer.setOutput(new FileImageOutputStream(
new File(folder.toString() + "/" + filename + ".jpg")));
// writes the file with given compression level
// from your JPEGImageWriteParam instance
writer.write(null, new IIOImage(capture, null, null), jpegParams);
或更长的方式
// use IIORegistry to get the available services
IIORegistry registry = IIORegistry.getDefaultInstance();
// return an iterator for the available ImageWriterSpi for jpeg images
Iterator<ImageWriterSpi> services = registry.getServiceProviders(ImageWriterSpi.class,
new ServiceRegistry.Filter() {
@Override
public boolean filter(Object provider) {
if (!(provider instanceof ImageWriterSpi)) return false;
ImageWriterSpi writerSPI = (ImageWriterSpi) provider;
String[] formatNames = writerSPI.getFormatNames();
for (int i = 0; i < formatNames.length; i++) {
if (formatNames[i].equalsIgnoreCase("JPEG")) {
return true;
}
}
return false;
}
},
true);
//...assuming that servies.hasNext() == true, I get the first available service.
ImageWriterSpi writerSpi = services.next();
ImageWriter writer = writerSpi.createWriterInstance();
// specifies where the jpg image has to be written
writer.setOutput(new FileImageOutputStream(
new File(folder.toString() + "/" + filename + ".jpg")));
// writes the file with given compression level
// from your JPEGImageWriteParam instance
writer.write(null, new IIOImage(capture, null, null), jpegParams);
这篇关于使用Java中的ImageIO设置jpg压缩级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!