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
相关产品推荐
相关产品推荐

