做项目的时候上传总是避免不了,如果上传的图片过大,占用空间会大,前端在进行加载展示的时候耗时也会长
压缩大小分为很多种:剪裁图片,等比缩放,降低质量等…
个人感觉,降低图片质量和之前差别不大,如果图片有什么特殊的大小要求或其他要求什么的,可以按照需要进行自行选择
公共代码
//在yml和properties里面配置,这样的也可以放到nacos,哪个都可以
@Value("${file.upload.path}")
private String fileUploadPath;
@PostMapping("test")
public void test(@RequestBody(required = false) MultipartFile multipartFile) throws IOException {
//模拟上传到服务器
//上传之后的文件
File file = new File(fileUploadPath,multipartFile.getOriginalFilename());
//上传
multipartFile.transferTo(file);
//获取文件名称
String originalFilename = multipartFile.getOriginalFilename();
//不带后缀的文件名
String headName = originalFilename.substring(0, originalFilename.indexOf("."));
//获得文件的扩展名(后缀名),扩展名不带“.”
String extName = FileNameUtil.extName(originalFilename);
//上传文件存放地址,后缀名和之前一样的
File smallFile = new File(fileUploadPath,"small"+multipartFile.getOriginalFilename());
//上传文件存放地址,后缀名为.jpg的
File smallFileJpg= new File(fileUploadPath,"small"+headName+".jpg");
Date sd = new Date();
//图片操作处
/**代码在这里:例如**/
//file源文件,转换到smallFile文件,并进行存储
ImgUtil.scale(
FileUtil.file(file),
FileUtil.file(smallFile),
0.5f//缩放比例
);
//图片操作处
Date ed = new Date();
System.out.println(ed.getTime()-sd.getTime());
}
Hutool
pom依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.1</version>
</dependency>
缩放图片:
相比之前图片大小发生改变
//图片操作处
ImgUtil.scale(
FileUtil.file(file),
FileUtil.file(smallFile),
0.5f//缩放比例
);
//图片操作处
图片格式 | 图片大小 | 压缩之后大小 | 需要时间(大约) | 缩放比例 |
---|---|---|---|---|
.jpg | 951KB | 155KB | 759ms | 0.5 |
.png | 2.00MB | 1.15MB | 867ms | 0.5 |
裁剪图片
Rectangle(x, y, width, height)
从图片左上角开始,x为横向移动距离,y为竖向
width为取得宽度(从左往右),height为取得高度(从上往下)
ImgUtil.cut(
FileUtil.file(file),
FileUtil.file(smallFile),
//裁剪的矩形区域
new Rectangle(0, 0, 0, 0)
);
图片类型转换
支持GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG等
ImgUtil.convert(
FileUtil.file(file),
FileUtil.file(smallFileJpg)
);
图片压缩
注:图片压缩只支持Jpg文件,所以需要用到图片类型转换,也可以自定义
if ("jpg".equals(extName)){
Img.from(FileUtil.file(file))
.setQuality(0.5)//压缩比率
.write(FileUtil.file(smallFile));
}else {
Img.from(FileUtil.file(file))
.setQuality(0.5)//压缩比率
.write(FileUtil.file(smallFileJpg));
}
图片格式 | 图片大小 | 压缩之后大小 | 需要时间(大约) | 压缩比例 |
---|---|---|---|---|
.jpg | 951KB | 312KB | 420ms | 0.5 |
.png | 2.00MB | 352KB | 1139ms | 0.5 |
Thumbnails
pom依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>[0.4,0.5)</version>
</dependency>
压缩图片
降低图片质量
Thumbnails.of(file)
.scale(1f)
.outputQuality(0.5f)//0-1数字越高,质量越高,占用越大
.toFile(smallFileJpg);
图片格式 | 图片大小 | 压缩之后大小 | 需要时间(大约) | 压缩比例 |
---|---|---|---|---|
.jpg | 951KB | 312KB | 463ms | 0.5 |
.png | 2.00MB | 352KB | 1692ms | 0.5 |
还有一种方式
Thumbnails.of(file)
.scale(1f)
.toFile(smallFileJpg);
图片格式 | 图片大小 | 压缩之后大小 | 需要时间(大约) |
---|---|---|---|
.jpg | 951KB | 591KB | 540ms |
.png | 2.00MB | 400KB | 1769ms |
缩放图片
Thumbnails.of(file)
.scale(0.5f)
.toFile(smallFileJpg);
图片格式 | 图片大小 | 压缩之后大小 | 需要时间(大约) | 缩放比例 |
---|---|---|---|---|
.jpg | 951KB | 136KB | 428ms | 0.5 |
.png | 2.00MB | 122KB | 1005ms | 0.5 |
所有的测试都会有误差200ms左右,读写速度可能会影响,上传服务器会受到网络的影响