Java BufferedImage JPG压缩无需写入文件

Jef*_*son 2 java jpeg bufferedimage image

我已经看过几个BufferedImage通过写入文件从Java 对象制作压缩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 = ???
Run Code Online (Sandbox Code Playgroud)

har*_*ldK 9

只是通过你ByteArrayOutputStreamImageIO.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();
Run Code Online (Sandbox Code Playgroud)

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

ImageOutputStream outputStream = new MemoryCacheImageOutputStream(compressed);
Run Code Online (Sandbox Code Playgroud)

  • @downwoter请不要"惩罚"一个完全有效和正确的答案,因为*你*认为这个问题不值得回答.相反,请投票或投票关闭它. (2认同)