diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/ImgDownUtils.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/ImgDownUtils.java index 15bac77..0f20502 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/ImgDownUtils.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/ImgDownUtils.java @@ -4,6 +4,13 @@ import com.zteits.urbanops.module.infra.framework.file.core.client.FileClient; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; +import javax.imageio.ImageIO; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -65,7 +72,10 @@ public class ImgDownUtils { try { String realPath = ImgDownUtils.getRealPath(url); byte[] bytes = client.getContent(realPath); - result.add(bytes); + //result.add(bytes); + // 核心:图片压缩,可自行调整参数 + byte[] compressBytes = compressImage(bytes, 1600, 0, 0.65f); + result.add(compressBytes); } catch (Exception e) { log.error("[图片下载] 异常:{},路径:{}", e.getMessage(), url); result.add(null); @@ -73,4 +83,64 @@ public class ImgDownUtils { } return result; } + + /** + * 图片压缩方法 + * @param imageBytes 原始图片字节 + * @param maxWidth 最大宽度,0不限制 + * @param maxHeight 最大高度,0不限制 + * @param quality jpg质量 0~1 + * @return 压缩后byte[] + * @throws IOException + */ + public static byte[] compressImage(byte[] imageBytes, int maxWidth, int maxHeight, float quality) throws IOException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes); + ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + + BufferedImage srcImg = ImageIO.read(bis); + if (srcImg == null) { + throw new IOException("无法解析图片流"); + } + + int srcW = srcImg.getWidth(); + int srcH = srcImg.getHeight(); + int targetW = srcW; + int targetH = srcH; + + // 等比例缩放 + if (maxWidth > 0 && srcW > maxWidth) { + targetW = maxWidth; + targetH = (int) (srcH * ((double) targetW / srcW)); + } + if (maxHeight > 0 && targetH > maxHeight) { + targetH = maxHeight; + targetW = (int) (srcW * ((double) targetH / srcH)); + } + + // 创建缩放画布 + BufferedImage targetImg = new BufferedImage(targetW, targetH, BufferedImage.TYPE_3BYTE_BGR); + Graphics2D g2d = targetImg.createGraphics(); + try { + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2d.drawImage(srcImg, 0, 0, targetW, targetH, null); + } finally { + g2d.dispose(); + } + + // JPG输出并设置质量 + javax.imageio.IIOImage iioImage = new javax.imageio.IIOImage(targetImg, null, null); + javax.imageio.ImageWriteParam writeParam = javax.imageio.ImageIO.getImageWritersByFormatName("jpg").next().getDefaultWriteParam(); + writeParam.setCompressionMode(javax.imageio.ImageWriteParam.MODE_EXPLICIT); + writeParam.setCompressionQuality(quality); + + javax.imageio.ImageWriter writer = javax.imageio.ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(ImageIO.createImageOutputStream(bos)); + try { + writer.write(null, iioImage, writeParam); + } finally { + writer.dispose(); + } + return bos.toByteArray(); + } + } }