From bc2da7908a227c09e5cc7b6d8dab3e9c94b784a1 Mon Sep 17 00:00:00 2001 From: zhanghua <314079846@qq.com> Date: 星期二, 12 十二月 2023 22:18:18 +0800 Subject: [PATCH] 图片压缩及bug修改 --- ycl-common/src/main/java/com/ycl/service/oss/impl/OssServiceImpl.java | 78 ++++++++++++++++++++++++++++++++++++-- 1 files changed, 73 insertions(+), 5 deletions(-) diff --git a/ycl-common/src/main/java/com/ycl/service/oss/impl/OssServiceImpl.java b/ycl-common/src/main/java/com/ycl/service/oss/impl/OssServiceImpl.java index 0ec8e5a..3a24a08 100644 --- a/ycl-common/src/main/java/com/ycl/service/oss/impl/OssServiceImpl.java +++ b/ycl-common/src/main/java/com/ycl/service/oss/impl/OssServiceImpl.java @@ -9,12 +9,18 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.Date; @Service @@ -38,12 +44,20 @@ try { // 鑾峰彇鏂囦欢鐨勫悕绉� String fileName = "sczf/" + file.getOriginalFilename(); + byte[] newImg = file.getBytes(); + String originalFilename = file.getOriginalFilename(); + String fileType = originalFilename.substring(originalFilename.lastIndexOf(".")); + if (".png".equalsIgnoreCase(fileType) || ".jpg".equalsIgnoreCase(fileType) || ".jpeg".equalsIgnoreCase(fileType)) { + if (file.getSize() > 2097152) { + newImg = compressUnderSize(file.getBytes(), 2097152); + } + } ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")))); // 璋冪敤oss鐨勬柟娉曞疄鐜伴暱浼� // 绗竴涓弬鏁� bucketName // 绗簩涓弬鏁� 涓婁紶鍒皁ss鐨勬枃浠惰矾寰勫拰鏂囦欢鍚嶇О - ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(file.getBytes()), objectMetadata); + ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(newImg), objectMetadata); // 鍏抽棴OSSClient銆� ossClient.shutdown(); // 鎶婁笂浼犵殑鏂囦欢璺緞杩斿洖 锛堟墜鍔ㄦ嫾鎺ワ級 @@ -58,6 +72,60 @@ // e.printStackTrace(); return null; } + } + + /** + * 鎸夌収 瀹介珮 姣斾緥鍘嬬缉 + * + * @param imgIs 寰呭帇缂╁浘鐗囪緭鍏ユ祦 + * @param scale 鍘嬬缉鍒诲害 + * @param out 杈撳嚭 + * @return 鍘嬬缉鍚庡浘鐗囨暟鎹� + * @throws IOException 鍘嬬缉鍥剧墖杩囩▼涓嚭閿� + */ + public byte[] compress(byte[] srcImgData, double scale) throws IOException { + BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData)); + int width = (int) (bi.getWidth() * scale); // 婧愬浘瀹藉害 + int height = (int) (bi.getHeight() * scale); // 婧愬浘楂樺害 + + Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH); + BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + + Graphics g = tag.getGraphics(); + g.setColor(Color.RED); + g.drawImage(image, 0, 0, null); // 缁樺埗澶勭悊鍚庣殑鍥� + g.dispose(); + + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + ImageIO.write(tag, "JPEG", bOut); + + return bOut.toByteArray(); + } + + /** + * 灏嗗浘鐗囧帇缂╁埌鎸囧畾澶у皬浠ュ唴 + * + * @param srcImgData 婧愬浘鐗囨暟鎹� + * @param maxSize 鐩殑鍥剧墖澶у皬 + * @return 鍘嬬缉鍚庣殑鍥剧墖鏁版嵁 + */ + public byte[] compressUnderSize(byte[] srcImgData, long maxSize) { + double scale = 0.9; + byte[] imgData = Arrays.copyOf(srcImgData, srcImgData.length); + + if (imgData.length > maxSize) { + do { + try { + imgData = compress(imgData, scale); + + } catch (IOException e) { + throw new IllegalStateException("鍘嬬缉鍥剧墖杩囩▼涓嚭閿欙紝璇峰強鏃惰仈绯荤鐞嗗憳锛�", e); + } + + } while (imgData.length > maxSize); + } + + return imgData; } private byte[] readInputStream(InputStream inStream) throws Exception { @@ -173,7 +241,7 @@ public static String getcontentType(String FilenameExtension) { - if (FilenameExtension.equalsIgnoreCase(".mp4")||FilenameExtension.equalsIgnoreCase(".mov")) { + if (FilenameExtension.equalsIgnoreCase(".mp4") || FilenameExtension.equalsIgnoreCase(".mov")) { return "video/mp4"; } if (FilenameExtension.equalsIgnoreCase(".bmp")) { -- Gitblit v1.8.0