Java BufferedImage JPG压缩无需写入文件

我已经看过几个通过写入文件从Java BufferedImage对象制作压缩JPG图像的例子 ,但是可以在不写入文件的情况下执行JPG压缩吗? 也许通过写这样的ByteArrayOutputStream

 ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam(); jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpgWriteParam.setCompressionQuality(0.7f); ImageOutputStream outputStream = createOutputStream(); jpgWriter.setOutput(outputStream); IIOImage outputImage = new IIOImage(image, null, null); // in this example, the JPG is written to file... // jpgWriter.write(null, outputImage, jpgWriteParam); // jpgWriter.dispose(); // ...but I want to compress without saving, such as ByteArrayOutputStream compressed = ??? 

只需将ByteArrayOutputStream传递给ImageIO.createImageOutputStream(...)如下所示:

 // The important part: Create in-memory stream ByteArrayOutputStream compressed = new ByteArrayOutputStream(); ImageOutputStream outputStream = ImageIO.createImageOutputStream(compressed); // NOTE: The rest of the code is just a cleaned up version of your code // Obtain writer for JPEG format ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next(); // Configure JPEG compression: 70% quality ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam(); jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpgWriteParam.setCompressionQuality(0.7f); // Set your in-memory stream as the output jpgWriter.setOutput(outputStream); // Write image as JPEG w/configured settings to the in-memory stream // (the IIOImage is just an aggregator object, allowing you to associate // thumbnails and metadata to the image, it "does" nothing) jpgWriter.write(null, new IIOImage(image, null, null), jpgWriteParam); // Dispose the writer to free resources jpgWriter.dispose(); // Get data for further processing... byte[] jpegData = compressed.toByteArray(); 

PS:默认情况下, ImageIO将在创建ImageOutputStream时使用磁盘缓存。 这可能会减慢内存中的流写入速度。 要禁用它,请使用ImageIO.setCache(false) (全局禁用磁盘缓存)或显式创建MemoryCacheImageOutputStream (local),如下所示:

 ImageOutputStream outputStream = new MemoryCacheImageOutputStream(compressed);