UI丢过来20M的图片,上传到在线压缩工具,上传不上去,好不容易上传上去了,压缩后下载要收费,心里哪个不愿意,于是网上查资料“Ctrl+C”弄了一个工具类,全部代码如下:
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.imageio.ImageIO;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
@Slf4j
public class ImageCompressUtil {
private static final Integer ZERO = 0;
private static final Integer ONE_ZERO_TWO_FOUR = 1024;
private static final Integer NINE_ZERO_ZERO = 900;
private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
private static final Double ZERO_EIGHT_FIVE = 0.85;
private static final Double ZERO_SIX = 0.6;
private static final Double ZERO_FOUR_FOUR = 0.44;
private static final Double ZERO_FOUR = 0.4;
/**
* 根据指定大小压缩图片
*
* @param imageBytes
* 源图片字节数组
* @param desFileSize
* 目标图片大小,单位kb
* @return 压缩质量后的图片字节数组
*/
public static byte[] compressPic(byte[] imageBytes, long desFileSize) {
if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
return imageBytes;
}
long srcSize = imageBytes.length;
double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
try {
while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream).scale(accuracy).outputQuality(accuracy).toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
log.info("图片原大小={}kb | 压缩后大小={}kb", srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
} catch (Exception e) {
log.error("【图片压缩】msg=图片压缩失败!", e);
}
return imageBytes;
}
/**
* 自动调节精度(经验数值)
*
* @param size
* 源图片大小
* @return 图片压缩质量比
*/
private static double getAccuracy(long size) {
double accuracy;
if (size < NINE_ZERO_ZERO) {
accuracy = ZERO_EIGHT_FIVE;
} else if (size < TWO_ZERO_FOUR_SEVEN) {
accuracy = ZERO_SIX;
} else if (size < THREE_TWO_SEVEN_FIVE) {
accuracy = ZERO_FOUR_FOUR;
} else {
accuracy = ZERO_FOUR;
}
return accuracy;
}
public static void main(String[] args) throws IOException {
BufferedImage result = ImageIO.read(Files.newInputStream(Paths.get("C:\\Users\\username\\Desktop\\1.jpg")));
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(result, "jpg", os);
//图个图片太大,则进行压缩
byte[] imageBytes = os.toByteArray();
if(imageBytes.length >= 400 * 1024) {
imageBytes = compressPic(os.toByteArray(), 400);
}
InputStream input = new ByteArrayInputStream(imageBytes);
BufferedImage targetImage = ImageIO.read(input);
File outPutFile = new File("C:\\Users\\username\\Desktop\\ys1.jpg");
ImageIO.write(targetImage, "jpg", outPutFile);
}
}
LoveCTO

