Java中如何将任意格式图片转为压缩WebP字节数组(无需本地存储)
无需本地存储,直接将图片转换为WebP字节数组
只需把输出目标从本地文件替换为内存字节流即可实现需求,核心是用ByteArrayOutputStream配合MemoryCacheImageOutputStream完成内存中写入,最终提取字节数组。
修改后的完整代码
import org.sejda.imageio.plugins.webp.WebPWriteParam; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.MemoryCacheImageOutputStream; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; public class WebPConverter { public static void main(String[] args) { String imageUrl = "https://upload.wikimedia.org/wikipedia/commons/f/f9/Phoenicopterus_ruber_in_S%C3%A3o_Paulo_Zoo.jpg"; try { URL url = new URL(imageUrl.replaceAll(" ", "%20")); // 自动关闭输入流 try (InputStream is = url.openStream()) { BufferedImage image = ImageIO.read(is); // 调用工具方法转换为WebP字节数组 byte[] webpBytes = convertImageToWebPBytes(image, 0.1f); // 直接使用webpBytes(如返回前端、存入数据库等) System.out.println("转换完成,WebP字节数组长度:" + webpBytes.length); } } catch (Exception e) { e.printStackTrace(); } } /** * 将BufferedImage转换为WebP格式字节数组 * @param image 输入图片 * @param quality 压缩质量(0.0f-1.0f,值越小压缩率越高) * @return WebP字节数组 * @throws IOException 转换过程IO异常 */ public static byte[] convertImageToWebPBytes(BufferedImage image, float quality) throws IOException { // 获取WebP写入器 ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); // 配置压缩参数 WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置有损压缩 writeParam.setCompressionType(writeParam.getCompressionTypes()[WebPWriteParam.LOSSY_COMPRESSION]); // 设置压缩质量 writeParam.setCompressionQuality(quality); // 内存中存储输出内容 try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); MemoryCacheImageOutputStream outputStream = new MemoryCacheImageOutputStream(baos)) { writer.setOutput(outputStream); writer.write(null, new IIOImage(image, null, null), writeParam); // 释放写入器资源 writer.dispose(); return baos.toByteArray(); } } }
关键改动说明
- 替换输出流:把原来的
FileImageOutputStream(写入本地文件)换成MemoryCacheImageOutputStream包装ByteArrayOutputStream,压缩内容直接写入内存字节数组,完全无需本地存储。 - 资源自动管理:用try-with-resources语法确保所有流和写入器自动关闭,避免资源泄漏。
- 提取字节数组:通过
ByteArrayOutputStream.toByteArray()直接获取压缩后的WebP字节数组,可直接用于网络传输、数据库存储等场景。
依赖保持不变
<dependency> <groupId>org.sejda.imageio</groupId> <artifactId>webp-imageio</artifactId> <version>0.1.6</version> </dependency>
内容的提问来源于stack exchange,提问作者Jemish Khunt
相关产品推荐
相关产品推荐

