你需要使用
JPEGImageWriteParam
,然后使用
ImageWriter.write()
保存图像。在写入之前,通过
ImageWriter.setOutput
设置输出。
设置压缩级别如下:
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null)
jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT)
jpegParams.setCompressionQuality(1f)
这里的1f
是一个浮点数,表示100%的图像质量。如果我没有记错,默认值是大约70%。
编辑
然后,您需要按照以下步骤获取ImageWriter
实例。有两种方法,一种是短方法,另一种是长方法(我两个都保留,以防万一)。
短方法(lapo在评论中建议)如下:
final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
writer.setOutput(new FileImageOutputStream(
new File(folder.toString() + "/" + filename + ".jpg")));
writer.write(null, new IIOImage(capture, null, null), jpegParams);
或者更长的方式
IIORegistry registry = IIORegistry.getDefaultInstance();
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);
ImageWriterSpi writerSpi = services.next();
ImageWriter writer = writerSpi.createWriterInstance();
writer.setOutput(new FileImageOutputStream(
new File(folder.toString() + "/" + filename + ".jpg")));
writer.write(null, new IIOImage(capture, null, null), jpegParams);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput(new MemoryCacheImageOutputStream(baos)); ... baos.flush(); byte[] returnImage = baos.toByteArray(); baos.close();
解释:这是一段Java代码,用于将图像数据保存在内存中而不是写入磁盘。首先创建一个字节数组输出流ByteArrayOutputStream
,然后将其设置为图像的输出流writer.setOutput(new MemoryCacheImageOutputStream(baos))
。接着将图像数据写入输出流,并使用baos.flush()
刷新缓冲区。最后,使用baos.toByteArray()
将数据转换为字节数组并返回,关闭输出流baos.close()
。 - lmiguelmhByteArrayOutputStream
,你将会得到一个java.lang.IllegalArgumentException: Illegal output type!
的错误提示。 - lmiguelmhjpgWriter.setOutput(ImageIO.createImageOutputStream(new File(path)))
,因为FileImageOutputStream
出现了问题。 - Evgeni Sergeev