您好,登錄后才能下訂單哦!
java如何實現壓縮圖片且不改變原圖尺寸?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
需求:
大于2MB的圖片需要壓縮到2MB以下,且不改變原圖的尺寸。
引入依賴:
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>
附件實體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class FileCO { /** * 附件字節流 */ private byte[] fileContent; /** * 附件OID */ private UUID attachmentOid; }
圖片實體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class ImageInfo { /** * 圖片字節流 */ 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; } }
關于java如何實現壓縮圖片且不改變原圖尺寸問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。