java如何實(shí)現(xiàn)壓縮圖片且不改變?cè)瓐D尺寸?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、福海網(wǎng)絡(luò)推廣、成都小程序開發(fā)、福海網(wǎng)絡(luò)營銷、福海企業(yè)策劃、福海品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供福海建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
需求:
大于2MB的圖片需要壓縮到2MB以下,且不改變?cè)瓐D的尺寸。
引入依賴:
net.coobird thumbnailator 0.4.8
附件實(shí)體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class FileCO { /** * 附件字節(jié)流 */ private byte[] fileContent; /** * 附件OID */ private UUID attachmentOid; }
圖片實(shí)體類:
@Builder @NoArgsConstructor @AllArgsConstructor @Data public class ImageInfo { /** * 圖片字節(jié)流 */ private byte[] imageBytes; /** * 圖片是否進(jìn)行壓縮 */ private Boolean compressFlag; /** * 圖片寬度 */ private Integer width; /** * 圖片高度 */ private Integer height; }
圖片壓縮工具類:
@Slf4j public class ImageUtils { /** * 合法圖片大小為2MB */ private static final Long LEGAL_IMAGE_SIZE = 1024 * 2L; /** * 圖片壓縮 當(dāng)圖片大小大于2MB進(jìn)行等比例壓縮 * 不修改圖片尺寸進(jìn)行壓縮 * * @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; } } /** * 計(jì)算壓縮精度 * * @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; } }
關(guān)于java如何實(shí)現(xiàn)壓縮圖片且不改變?cè)瓐D尺寸問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。