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)
只是通过你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();
Run Code Online (Sandbox Code Playgroud)
PS:默认情况下,ImageIO在创建时使用磁盘缓存ImageOutputStream.这可能会减慢内存中的流写入速度.要禁用它,请使用ImageIO.setCache(false)(全局禁用磁盘缓存)或显式创建MemoryCacheImageOutputStream(本地),如下所示:
ImageOutputStream outputStream = new MemoryCacheImageOutputStream(compressed);
Run Code Online (Sandbox Code Playgroud)