ImageIO的任何替代方案.写入将缓冲区图像转换为GIF字节(比ImageIO更快)



我的问题是,当使用imageio.write时,我看到它正在使用hdd,还阅读了jDeli(但太贵了(、Apache Commons、JAI,它们要快得多。。。。

我想使用例程返回的编码字节。。。在自定义远程桌面实用程序中。。。

public static byte[] imageToJPEGByteArray(Image aImage, int width, int height, int qualityPercent) throws IOException {
byte[] imageBytes = new byte[0];

float quality = 75 / 100f;
BufferedImage destImage;
destImage = SwingFXUtils.fromFXImage(aImage, null);

// Output JPEG byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();

if(qualityPercent != -1) {
// Start to create JPEG with quality option
ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("gif");
if (iter.hasNext()) {
writer = (ImageWriter) iter.next();
}
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
writer.setOutput(ios); 
ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwparam.setCompressionQuality(quality);
writer.write(null, new IIOImage(destImage, null, null), iwparam);
ios.flush();
writer.dispose();
ios.close();
// Done creating JPEG with quality option
} else {
// This one line below created a JPEG file without quality option
ImageIO.write(destImage, "gif", baos);
}

baos.flush();
imageBytes = baos.toByteArray();
baos.close();

// Done
return imageBytes; 
}

如果您发现此代码在保存到ByteArrayOutputStream时会导致磁盘活动,那么您应该尝试设置ImageIO"使用高速缓存";至false:的标志

ImageIO.setUseCache(false);

setUseCache的Javadoc说:

设置一个标志,指示在创建ImageInputStream和ImageOutputStreams时是否应使用基于磁盘的缓存文件。

最新更新