使用Thumbnails压缩工具进行压缩
导包
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
工具类
package cn.oxe.utils;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.util.ObjectUtils;
import java.io.*;
/*
*@author cirry
*@Date: 2021/12/10$ 9:56$
*/
public class FileUtil {
public static void main(String[] args) throws Exception {
//输入文件
File inFile = new File("C:/Users/86156/Desktop/11.jpg");
byte[] bytes = zipFile(FileUtil.fileToByte(inFile), 300 * 1024, 0.9f);
System.out.println(bytes.length);
//输出文件
File outFile = new File("C:/Users/86156/Desktop/300.jpg");
FileUtil.byteToFile(bytes, outFile);
}
/**
* 压缩文件 压到指定大小
*
* @param bytes 文件byte
* @param maxSize 压缩到此值以内
* @param ziPratio 压缩比率 取值0-1 越大越接近原图
* @return
*/
public static byte[] zipFile(byte[] bytes, long maxSize, float ziPratio){
System.out.println("开始压缩图片, 原始图片大小: " + bytes.length);
if (bytes.length < maxSize){
return bytes;
}
ByteArrayInputStream ins = new ByteArrayInputStream(bytes);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
Thumbnails.of(ins)
.scale(ziPratio) //图片大小(长宽)压缩 从0按照
.outputQuality(ziPratio) //图片质量压缩比例 从0-1,越接近1质量越好
.toOutputStream(out); //输出流输出
// .toOutputStream(new FileOutputStream("C:/Users/86156/Desktop/11_10%.jpg")) //文件输出
} catch (IOException e) {
e.printStackTrace();
}
//递归压缩 压倒指定大小为止
return zipFile(out.toByteArray(), maxSize, ziPratio);
}
/**
* 文件转byte[]
*
* @param file
* @return
*/
public static byte[] fileToByte(File file){
if (ObjectUtils.isEmpty(file)){
return null;
}
byte[] fb = null;
FileInputStream fs = null;
try {
fs = new FileInputStream(file);
fb = new byte[(int)file.length()];
fs.read(fb);
return fb;
} catch (Exception e) {
e.printStackTrace();
}finally {
if (null != fs){
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return fb;
}
/**
* byte数组转文件
*
* @param bytes
* @param file
*/
public static void byteToFile(byte[] bytes, File file) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
//输出流
fos = new FileOutputStream(file);
//缓冲流
bos = new BufferedOutputStream(fos);
//将字节数组写出
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}