需求:
大于2MB的圖片需要壓縮到2MB以下,且不改變原圖的尺寸。
(推薦教程:java入門教程)
引入依賴:
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>
附件實體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class FileCO { /** * 附件字節(jié)流 */ private byte[] fileContent; /** * 附件OID */ private UUID attachmentOid; }
(視頻教程推薦:java視頻教程)
圖片實體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class ImageInfo { /** * 圖片字節(jié)流 */ private byte[] imageBytes; /** * 圖片是否進行壓縮 */ private Boolean compressFlag; /** * 圖片寬度 */ private Integer width; /** * 圖片高度 */ private Integer height; }
圖片壓縮工具類:
@Slf4j public class ImageUtils { /** * 合法圖片大小為2MB */ private static final Long LEGAL_IMAGE_SIZE = 1024 * 2L; /** * 圖片壓縮 當圖片大小大于2MB進行等比例壓縮 * 不修改圖片尺寸進行壓縮 * * @param fileCO * @return */ public static ImageInfo compressImageForScale(FileCO fileCO) throws IOException { byte[] imageBytes = fileCO.getFileContent(); UUID attachmentOid = fileCO.getAttachmentOid(); try { BufferedImage sourceImage = ImageIO.read(new ByteArrayInputStream(imageBytes)); //高度 int height = sourceImage.getHeight(); //寬度 int width = sourceImage.getWidth(); if (imageBytes.length <= 0 || imageBytes.length < LEGAL_IMAGE_SIZE * 1024) { return ImageInfo.builder() .imageBytes(imageBytes) .width(width) .height(height) .compressFlag(false) .build(); } long srcSize = imageBytes.length; double accuracy = getAccuracy(srcSize / 1024); while (imageBytes.length > LEGAL_IMAGE_SIZE * 1024) { ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); Thumbnails.of(inputStream) .scale(1f) .outputQuality(accuracy) .toOutputStream(outputStream); imageBytes = outputStream.toByteArray(); } log.info("【圖片壓縮】附件OID={} | 圖片原大小={}kb | 壓縮后大小={}kb", attachmentOid, srcSize / 1024, imageBytes.length / 1024); return ImageInfo.builder() .imageBytes(imageBytes) .width(width) .height(height) .compressFlag(true) .build(); } catch (Exception e) { log.error("【圖片壓縮】msg=圖片壓縮失敗!", e); throw e; } } /** * 計算壓縮精度 * * @param size * @return */ private static double getAccuracy(long size) { double accuracy; //圖片大小小于4M,壓縮精度為0.44;否則精度為0.4 if (size <= 2048 * 2) { accuracy = 0.44; } else { accuracy = 0.4; } return accuracy; } }