Java图片压缩工具
工具类使用场景
- 公司做人脸识别项目时候需要上传学生、家长、教师、访客的正面照图片,但是人脸识别机器有限制只接收200KB-1M的图片,所以必须做图片压缩到指定范围大少。
- APP上传使用产品的评价附件图片,手机直接拍照上传的图片过大,直接存储导致文件服务器存储容量递减,所以要压缩到指定范围大少。
注意事项
- 最大递归压缩深度默认为20,一般情况下JVM支持1000~2000的栈,所以请勿设置过大的递归深度,否则会抛出:stackoverflowerror.
- 质量比与尺寸比默认均为0.85去压缩,压缩出来的图片少于期待范围时候,会自动递增质量比与尺寸比去压缩。
- 图片压缩比较耗时和性能,能异步的话建议异步处理来消峰。本机压缩6M图片到600KB时候耗时3秒。
依赖关系
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.14</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.29</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency>
核心代码
1.压缩类
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author huangrusheng
* @version 1.0
* @date 2021/5/20 15:27
*/
@Slf4j
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public final class ImageCompressUtil {
/**
* @param imageSource 图片源
* @param outputStream 压缩后的图片输出地
* @return
* @throws IOException
*/
public static boolean compress(ImageSource imageSource, OutputStream outputStream) throws IOException{
boolean result = compress(imageSource);
if(result){
outputStream.write(imageSource.getSource());
}
return result;
}
public static boolean compress(ImageSource imageSource) throws IOException {
if(imageSource.getNumberOfCompressions() == 0){
imageSource.setStartTime(System.currentTimeMillis());
imageSource.setOriginalSource(imageSource.getSource());
}
if( imageSource.getSource().length