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

Spring Boot中如何压缩PNG/JPEG图片文件大小并保存

实现图片压缩的修改方案

核心逻辑借助JDK自带的ImageIO类完成图片读取、压缩参数配置、压缩后写入的流程,针对JPEG/JPG和PNG格式分别适配不同的压缩规则,修改后代码如下:

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import org.springframework.web.multipart.MultipartFile;

public void saveImage(MultipartFile image_one, MultipartFile image_two, MultipartFile image_three) throws Exception{
    System.out.println("Inside Save image Repo");
    
    String folder = "C:/Users/HP/Photos";
    // JPEG压缩质量,范围0-1,越高画质越好体积越大,建议取值0.7-0.9
    float jpegQuality = 0.8f;
    // PNG压缩级别,范围0-9,越高压缩率越高耗时越长,建议取值5-7
    int pngCompressLevel = 6;

    try {
        // 处理第一张图片,剩余两张逻辑完全一致可复用compressAndSaveImage方法
        compressAndSaveImage(image_one, folder, jpegQuality, pngCompressLevel);
    } catch (Exception e) {
        System.out.println("Inside Catch Block -> Image save failed ");
        e.printStackTrace();
    }   
}

/**
 * 压缩并保存图片的通用方法
 */
private void compressAndSaveImage(MultipartFile file, String folder, float jpegQuality, int pngCompressLevel) throws Exception {
    String fileName = file.getOriginalFilename();
    // 自动拼接路径分隔符,避免原始代码的路径拼接错误
    Path savePath = Paths.get(folder, fileName);
    String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

    // 读取原始图片
    byte[] originalBytes = file.getBytes();
    BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(originalBytes));
    System.out.println("Original image size: " + originalBytes.length + ",Save path: " + savePath);

    // 获取对应格式的写入器
    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(fileExt);
    if (!writers.hasNext()) {
        // 不支持的格式直接原文件保存
        Files.write(savePath, originalBytes);
        return;
    }
    ImageWriter writer = writers.next();
    ImageWriteParam writeParam = writer.getDefaultWriteParam();

    // 配置压缩参数
    if (fileExt.equals("jpg") || fileExt.equals("jpeg")) {
        writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        writeParam.setCompressionQuality(jpegQuality);
    } else if (fileExt.equals("png")) {
        writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        writeParam.setCompressionQuality(pngCompressLevel / 9f); // 转换为0-1范围的参数
    }

    // 写入压缩后的图片
    try (OutputStream outputStream = new FileOutputStream(savePath.toFile())) {
        writer.setOutput(ImageIO.createImageOutputStream(outputStream));
        writer.write(null, new IIOImage(originalImage, null, null), writeParam);
    } finally {
        writer.dispose();
    }

    System.out.println("Compressed image size: " + savePath.toFile().length());
}
注意事项
  • 可根据业务场景调整压缩参数,JPEG格式建议质量不低于0.7避免画质损失过重
  • 带透明通道的PNG图不要转存为JPEG格式,会丢失透明信息
  • 剩余image_two、image_three的处理和image_one完全一致,重复调用compressAndSaveImage方法即可

内容的提问来源于stack exchange,提问作者Tejas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:09:03