java imageio,使用Java中的ImageIO设置jpg压缩级别

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);

}

}

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?

解决方案

You have to use JPEGImageWriteParam and then save the image with ImageWriter.write(). Before to write, set the output via ImageWriter.setOutput.

Set the compression level as follows:

JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null);

jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

jpegParams.setCompressionQuality(1f);

Where 1f is a float number that stands for 100% quality. Default value is around 70% if I don't remember wrong.

EDIT

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).

The short way (suggested by lapo in one comment) is:

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);

or longer way

// use IIORegistry to get the available services

IIORegistry registry = IIORegistry.getDefaultInstance();

// return an iterator for the available ImageWriterSpi for jpeg images

Iterator 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值