You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:32