首页 > 编程知识 正文

java片压缩到指定大小,java 片压缩

时间:2023-05-06 20:46:50 阅读:281351 作者:4860

最近工作中涉及图片压缩相关的操作,需求如下:

大于2MB的图片需要压缩到2MB以下,且不改变原图的尺寸

引入依赖

<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>

附件实体类

@Builder@NoArgsConstructor@AllArgsConstructor@Datapublic class FileCO { /** * 附件字节流 */ private byte[] fileContent; /** * 附件OID */ private UUID attachmentOid;}

图片实体类

@Builder@NoArgsConstructor@AllArgsConstructor@Datapublic class ImageInfo { /** * 图片字节流 */ private byte[] imageBytes; /** * 图片是否进行压缩 */ private Boolean compressFlag; /** * 图片宽度 */ private Integer width; /** * 图片高度 */ private Integer height;}

图片压缩工具类

@Slf4jpublic 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(); //如果压缩后图片大小未改变则跳出循环,防止死循环 if (srcSize == imageBytes.length) { log.warn("【图片压缩】msg=图片压缩失败,图片大小未改变!"); break; } } 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; }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。