這是壓縮到小於300KB的,循環壓縮,一次不行再壓一次,
不廢話,直接貼代碼
<!-- 圖片縮略圖 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!--<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
package com.uniview.keepalive.util; import lombok.extern.slf4j.Slf4j; import net.coobird.thumbnailator.Thumbnails; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @Slf4j public class PicUtils { private static Logger logger = LoggerFactory.getLogger(PicUtils.class); public static void main(String[] args) throws IOException { byte[] bytes = FileUtils.readFileToByteArray(new File("C:\\Users\\Administrator\\Desktop\\鄧111111.jpg")); long l = System.currentTimeMillis(); bytes = PicUtils.compressPicForScale(bytes, 300, "x");// 圖片小於300kb System.out.println(System.currentTimeMillis() - l); FileUtils.writeByteArrayToFile(new File("C:\\Users\\Administrator\\Desktop\\鄧11111壓縮后.jpg"), bytes); } /** * 根據指定大小壓縮圖片 * * @param imageBytes 源圖片字節數組 * @param desFileSize 指定圖片大小,單位kb * @param imageId 影像編號 * @return 壓縮質量后的圖片字節數組 */ public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) { if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) { return imageBytes; } long srcSize = imageBytes.length; double accuracy = getAccuracy(srcSize / 1024); try { while (imageBytes.length > desFileSize * 1024) { ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); Thumbnails.of(inputStream) .scale(accuracy) .outputQuality(accuracy) .toOutputStream(outputStream); imageBytes = outputStream.toByteArray(); } logger.info("【圖片壓縮】imageId={} | 圖片原大小={}kb | 壓縮后大小={}kb", imageId, srcSize / 1024, imageBytes.length / 1024); } catch (Exception e) { logger.error("【圖片壓縮】msg=圖片壓縮失敗!", e); } return imageBytes; } /** * 自動調節精度(經驗數值) * * @param size 源圖片大小 * @return 圖片壓縮質量比 */ private static double getAccuracy(long size) { double accuracy; if (size < 900) { accuracy = 0.85; } else if (size < 2047) { accuracy = 0.6; } else if (size < 3275) { accuracy = 0.44; } else { accuracy = 0.4; } return accuracy; } }