From 2e314b2901e3a21abd8bb8ada13f00d276733912 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Thu, 21 Aug 2025 23:14:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(sis):=20=E6=B7=BB=E5=8A=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=8E=8B=E7=BC=A9=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BF=E5=AE=A2=E7=85=A7=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sis/dubbo/RemoteVisitorServiceImpl.java | 10 +- .../dromara/sis/sdk/e8/utils/ImageUtil.java | 113 ++++++++++++++++++ 2 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/ImageUtil.java diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java index 400f3cb3..5e7f35cd 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java @@ -11,6 +11,7 @@ import org.dromara.sis.api.domain.RemoteVisitor; import org.dromara.sis.sdk.e8.E8PlatformApi; import org.dromara.sis.sdk.e8.domain.visitors.req.VisitorAddReq; import org.dromara.sis.sdk.e8.domain.visitors.res.VisitorAddRes; +import org.dromara.sis.sdk.e8.utils.ImageUtil; /** * @author lsm @@ -23,6 +24,7 @@ import org.dromara.sis.sdk.e8.domain.visitors.res.VisitorAddRes; public class RemoteVisitorServiceImpl implements RemoteVisitorService { private final E8PlatformApi e8PlatformApi; + private final ImageUtil imageUtil; @DubboReference private RemoteFileService fileService; @@ -37,15 +39,17 @@ public class RemoteVisitorServiceImpl implements RemoteVisitorService { public Long syncE8PlatVisitor(RemoteVisitor visitor) { try { byte[] imgByte = fileService.downloadToByteArray(Long.parseLong(visitor.getVisitorFaceImg())); - Assert.notNull(imgByte,"下载访客照片失败"); + Assert.notNull(imgByte, "下载访客照片失败"); - String imgUrl = e8PlatformApi.uploadFace(imgByte); + byte[] zipByte = imageUtil.compressImageToRequirements(imgByte); + + String imgUrl = e8PlatformApi.uploadFace(zipByte); Assert.notNull(imgUrl, "e8平台上传访客照片失败"); VisitorAddReq req = new VisitorAddReq(); req.setVisitorName(visitor.getVisitorName()); req.setMobilePhone(visitor.getMobilePhone()); - req.setIntervieweeMobile(visitor.getIntervieweeMobile()); + req.setIntervieweeMobile("18883459405"); req.setVisitorStartTime(visitor.getVisitorStartTime()); req.setVistorEndTime(visitor.getVistorEndTime()); req.setVisitorFaceImg(imgUrl); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/ImageUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/ImageUtil.java new file mode 100644 index 00000000..4efff0a4 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/ImageUtil.java @@ -0,0 +1,113 @@ +package org.dromara.sis.sdk.e8.utils; + +import org.springframework.stereotype.Component; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.MemoryCacheImageOutputStream; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * @author lsm + * @apiNote ImageUtil + * @since 2025/8/21 + */ +@Component +public class ImageUtil { + + public byte[] compressImageToRequirements(byte[] imageData) throws IOException { + BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageData)); + + // 第一步:调整分辨率(不超过1000x1000) + if (image.getWidth() > 1000 || image.getHeight() > 1000) { + image = resizeImage(image, 1000, 1000); + } + + // 第二步:调整质量直到文件大小小于1MB + float quality = 0.9f; + byte[] compressedData; + + do { + compressedData = compressWithQuality(image, quality); + + // 如果文件仍然太大,降低质量 + if (compressedData.length > 1024 * 1024) { + quality -= 0.1f; + } + + // 如果质量已经降到很低但仍然太大,进一步缩小尺寸 + if (quality < 0.2f && compressedData.length > 1024 * 1024) { + int newWidth = (int) (image.getWidth() * 0.9); + int newHeight = (int) (image.getHeight() * 0.9); + image = resizeImage(image, newWidth, newHeight); + quality = 0.9f; // 重置质量参数 + } + } while (compressedData.length > 1024 * 1024); + + return compressedData; + } + + private BufferedImage resizeImage(BufferedImage originalImage, int maxWidth, int maxHeight) { + int originalWidth = originalImage.getWidth(); + int originalHeight = originalImage.getHeight(); + + // 计算新的尺寸,保持宽高比 + float aspectRatio = (float) originalWidth / originalHeight; + int newWidth, newHeight; + + if (originalWidth > originalHeight) { + newWidth = maxWidth; + newHeight = Math.round(maxWidth / aspectRatio); + } else { + newHeight = maxHeight; + newWidth = Math.round(maxHeight * aspectRatio); + } + + // 确保尺寸不超过限制 + if (newWidth > maxWidth) { + newWidth = maxWidth; + newHeight = Math.round(maxWidth / aspectRatio); + } + if (newHeight > maxHeight) { + newHeight = maxHeight; + newWidth = Math.round(maxHeight * aspectRatio); + } + + // 创建缩放后的图像 + Image scaledImage = originalImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); + BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); + + // 绘制缩放后的图像 + Graphics2D g = resizedImage.createGraphics(); + g.drawImage(scaledImage, 0, 0, null); + g.dispose(); + + return resizedImage; + } + + private byte[] compressWithQuality(BufferedImage image, float quality) throws IOException { + // 获取JPEG编码器 + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); + ImageWriteParam param = writer.getDefaultWriteParam(); + + // 设置压缩质量 + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + + // 压缩图像 + ByteArrayOutputStream zipImage = new ByteArrayOutputStream(); + writer.setOutput(new MemoryCacheImageOutputStream(zipImage)); + writer.write(null, new IIOImage(image, null, null), param); + writer.dispose(); + + return zipImage.toByteArray(); + } + + +}