From ded7d4a6e64fdfe6266613e1cc830d4dea824394 Mon Sep 17 00:00:00 2001 From: wyw <373811525@qq.com> Date: Mon, 19 Aug 2024 18:11:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=8C=89=E8=A7=92=E5=BA=A6?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E7=BF=BB=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 4 +- fastbee-common/pom.xml | 5 ++ .../common/utils/RotateImageUtils.java | 70 +++++++++++++++++++ .../common/utils/file/FileUploadUtils.java | 20 +++++- fastbee-open-api/pom.xml | 1 + .../controller/UploadedPhotosController.java | 28 ++++++-- 6 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 fastbee-common/src/main/java/com/fastbee/common/utils/RotateImageUtils.java diff --git a/fastbee-admin/src/main/resources/application.yml b/fastbee-admin/src/main/resources/application.yml index 03b74cf..8af0799 100644 --- a/fastbee-admin/src/main/resources/application.yml +++ b/fastbee-admin/src/main/resources/application.yml @@ -5,8 +5,8 @@ fastbee: copyrightYear: 2023 # 版权年份 demoEnabled: true # 实例演示开关 # 文件路径,以uploadPath结尾 示例( Windows配置 D:/uploadPath,Linux配置 /uploadPath) - profile: /home/soft/hzwmiot/uploadPath -# profile: D:/uploadPath +# profile: /home/soft/hzwmiot/uploadPath + profile: D:/uploadPath addressEnabled: true # 获取ip地址开关 captchaType: math # 验证码类型 math 数组计算 char 字符验证 diff --git a/fastbee-common/pom.xml b/fastbee-common/pom.xml index c6b3b55..4fdeafe 100644 --- a/fastbee-common/pom.xml +++ b/fastbee-common/pom.xml @@ -211,6 +211,11 @@ org.mapstruct mapstruct-processor + + org.springframework + spring-test + + diff --git a/fastbee-common/src/main/java/com/fastbee/common/utils/RotateImageUtils.java b/fastbee-common/src/main/java/com/fastbee/common/utils/RotateImageUtils.java new file mode 100644 index 0000000..c148331 --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/utils/RotateImageUtils.java @@ -0,0 +1,70 @@ +package com.fastbee.common.utils; + +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * 图片旋转类 + */ +public class RotateImageUtils { + + /** + * 对图片进行旋转 + * + * @param src 被旋转图片 + * @param angel 旋转角度 + * @return 旋转后的图片 + */ + public static BufferedImage Rotate(Image src, int angel) { + int src_width = src.getWidth(null); + int src_height = src.getHeight(null); + // 计算旋转后图片的尺寸 + Rectangle rect_des = calcRotatedSize(new Rectangle(new Dimension( + src_width, src_height)), angel); + BufferedImage res = null; + res = new BufferedImage(rect_des.width, rect_des.height, + BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = res.createGraphics(); + // 进行转换 + g2.translate((rect_des.width - src_width) / 2, + (rect_des.height - src_height) / 2); + g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2); + + g2.drawImage(src, null, null); + return res; + } + + /** + * 计算旋转后的图片 + * + * @param src 被旋转的图片 + * @param angel 旋转角度 + * @return 旋转后的图片 + */ + public static Rectangle calcRotatedSize(Rectangle src, int angel) { + // 如果旋转的角度大于90度做相应的转换 + if (angel >= 90) { + if (angel / 90 % 2 == 1) { + int temp = src.height; + src.height = src.width; + src.width = temp; + } + angel = angel % 90; + } + + double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2; + double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r; + double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2; + double angel_dalta_width = Math.atan((double) src.height / src.width); + double angel_dalta_height = Math.atan((double) src.width / src.height); + + int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha + - angel_dalta_width)); + int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha + - angel_dalta_height)); + int des_width = src.width + len_dalta_width * 2; + int des_height = src.height + len_dalta_height * 2; + return new Rectangle(new Dimension(des_width, des_height)); + } + +} diff --git a/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java b/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java index b5a7ed3..f8c2e78 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java +++ b/fastbee-common/src/main/java/com/fastbee/common/utils/file/FileUploadUtils.java @@ -1,10 +1,13 @@ package com.fastbee.common.utils.file; -import java.io.File; -import java.io.IOException; +import java.awt.image.BufferedImage; +import java.io.*; import java.nio.file.Paths; import java.util.Objects; + +import com.fastbee.common.utils.RotateImageUtils; import org.apache.commons.io.FilenameUtils; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import com.fastbee.common.config.RuoYiConfig; import com.fastbee.common.constant.Constants; @@ -15,6 +18,8 @@ import com.fastbee.common.utils.DateUtils; import com.fastbee.common.utils.StringUtils; import com.fastbee.common.utils.uuid.Seq; +import javax.imageio.ImageIO; + /** * 文件上传工具类 * @@ -66,6 +71,17 @@ public class FileUploadUtils } } + public static final String uploadByAngle(String baseDir, MultipartFile file,Integer angle) throws IOException { + BufferedImage src = ImageIO.read(file.getInputStream()); + BufferedImage rotate = RotateImageUtils.Rotate(src, angle); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(rotate, getExtension(file),byteArrayOutputStream); + InputStream input = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + MultipartFile multipartFile = new MockMultipartFile("file",file.getOriginalFilename(),"text/plain", input); + return upload(baseDir, multipartFile); + } + + /** * 根据文件路径上传 * diff --git a/fastbee-open-api/pom.xml b/fastbee-open-api/pom.xml index d06b295..72281fb 100644 --- a/fastbee-open-api/pom.xml +++ b/fastbee-open-api/pom.xml @@ -43,6 +43,7 @@ fastbee-waterele-service + diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/controller/anfang/controller/UploadedPhotosController.java b/fastbee-open-api/src/main/java/com/fastbee/data/controller/anfang/controller/UploadedPhotosController.java index f26da0c..429e1d4 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/data/controller/anfang/controller/UploadedPhotosController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/data/controller/anfang/controller/UploadedPhotosController.java @@ -8,6 +8,7 @@ import com.fastbee.common.core.page.TableDataInfo; import com.fastbee.common.enums.BusinessType; import com.fastbee.common.exception.ServiceException; import com.fastbee.common.model.bto.DoorAlertBto; +import com.fastbee.common.utils.RotateImageUtils; import com.fastbee.common.utils.file.FileUploadUtils; import com.fastbee.common.utils.poi.ExcelUtil; import com.fastbee.data.controller.anfang.service.IUploadedPhotosService; @@ -15,12 +16,18 @@ import com.fastbee.iot.model.anfang.UploadedPhotos; import com.fastbee.iot.service.impl.DeviceServiceImpl; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; @@ -97,8 +104,17 @@ public class UploadedPhotosController extends BaseController { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, photo); + String fileName = FileUploadUtils.uploadByAngle(filePath, photo, 180); +// BufferedImage src = ImageIO.read(photo.getInputStream()); +// BufferedImage rotate = RotateImageUtils.Rotate(src, 180); +// ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); +// ImageIO.write(rotate, "png",byteArrayOutputStream); +// InputStream input = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); +// String name = photo.getName(); +// String originalFilename = photo.getOriginalFilename(); +// MultipartFile multipartFile = new MockMultipartFile("file",photo.getOriginalFilename(),"text/plain", input); +// // 上传并返回新文件名称 +// String fileName = FileUploadUtils.upload(filePath, multipartFile); // 处理可能为空的字段 Double latitude = isEmpty(lat) ? 0.0 : Double.valueOf(lat); Double longitude = isEmpty(lng) ? 0.0 : Double.valueOf(lng); @@ -110,10 +126,10 @@ public class UploadedPhotosController extends BaseController { //抓拍监控,并返回路径 String monitorPath = uploadedPhotosService.captureMonitorPhoto(sn); //推送告警短信通知 - uploadedPhotosService.sendAlarmMessage(sn, doorState, shakeState,eventType); + uploadedPhotosService.sendAlarmMessage(sn, doorState, shakeState, eventType); UploadedPhotos uploadedPhotos = new UploadedPhotos( null, fileName, monitorPath, imei, sn, latitude, longitude, - temperature, doorState, shakeState,cpuTemp,eventType,anFangStatus, date + temperature, doorState, shakeState, cpuTemp, eventType, anFangStatus, date ); return toAjax(uploadedPhotosService.insertUploadedPhotos(uploadedPhotos)); } catch (IOException e) { @@ -157,9 +173,9 @@ public class UploadedPhotosController extends BaseController { //抓拍监控,并返回路径 String monitorPath = uploadedPhotosService.captureMonitorPhoto(sn); //推送告警短信通知 - uploadedPhotosService.sendAlarmMessage(sn, doorState, shakeState,eventType); + uploadedPhotosService.sendAlarmMessage(sn, doorState, shakeState, eventType); UploadedPhotos uploadedPhotos = new UploadedPhotos( - null, "", monitorPath, imei, sn, latitude, longitude, temperature, doorState, shakeState,cpuTemp,eventType,anFangStatus, date + null, "", monitorPath, imei, sn, latitude, longitude, temperature, doorState, shakeState, cpuTemp, eventType, anFangStatus, date ); return toAjax(uploadedPhotosService.insertUploadedPhotos(uploadedPhotos)); }