java实现jpeg压缩,Java BufferedImage JPG压缩而无需写入文件

I've seen several examples of making compressed JPG images from Java BufferedImage objects by writing to file, but is it possible to perform JPG compression without writing to file? Perhaps by writing to a ByteArrayOutputStream like this?

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 = ???

解决方案

Just pass your ByteArrayOutputStream to ImageIO.createImageOutputStream(...) like this:

// 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: By default, ImageIO will use disk caching when creating your ImageOutputStream. This may slow down your in-memory stream writing. To disable it, use ImageIO.setCache(false) (disables disk caching globally) or explicitly create an MemoryCacheImageOutputStream (local), like this:

ImageOutputStream outputStream = new MemoryCacheImageOutputStream(compressed);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用ImageIO类来读取和写入图像文件,同时也支持对图像进行压缩。 以下是一段Java实现对图像文件压缩的示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageCompressor { public static void main(String[] args) { String inputFileName = "input.jpg"; String outputFileName = "output.jpg"; int compressionQuality = 0.5; // 压缩质量,范围从0到1 try { // 读取输入文件 BufferedImage inputImage = ImageIO.read(new File(inputFileName)); // 创建输出文件 File outputFile = new File(outputFileName); // 写入输出文件 ImageIO.write(inputImage, "jpg", outputFile); // 压缩输出文件 ImageIO.write(inputImage, "jpg", outputFile); // 设置压缩质量 ImageWriteParam writeParam = ImageIO.getImageWritersByFormatName("jpg").next().getDefaultWriteParam(); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); writeParam.setCompressionQuality(compressionQuality); // 写入压缩后的图像 ImageOutputStream outputStream = ImageIO.createImageOutputStream(outputFile); ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); writer.setOutput(outputStream); writer.write(null, new IIOImage(inputImage, null, null), writeParam); // 关闭输出流和写入器 outputStream.close(); writer.dispose(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例代码中,我们首先使用`ImageIO.read`方法读取输入文件,然后使用`ImageIO.write`方法将其写入输出文件。接下来,我们使用`ImageIO.getImageWritersByFormatName`方法获取JPEG格式的图像写入器,并使用`ImageWriteParam`类设置压缩质量。最后,我们使用`ImageIO.createImageOutputStream`方法创建输出流,并使用`ImageWriter.write`方法将压缩后的图像写入输出流,最终关闭输出流和写入器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值