图片上传,图片压缩大小

502 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

做项目的时候上传总是避免不了,如果上传的图片过大,占用空间会大,前端在进行加载展示的时候耗时也会长

压缩大小分为很多种:剪裁图片,等比缩放,降低质量等... 个人感觉,降低图片质量和之前差别不大,如果图片有什么特殊的大小要求或其他要求什么的,可以按照需要进行自行选择 这里就进行简单配置测试

公共代码,之后写的代码放到这里就可以直接运行

	//在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());
        File smallFileJpg= new File(fileUploadPath,"small"+headName+".jpg");
      
        Date sd = new Date();
        //图片操作处
        /**下面写的代码放到这里**/
        //图片操作处
        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//缩放比例
	);
	//图片操作处

测试数据仅供参考

图片格式图片大小压缩之后大小需要时间(大约)缩放比例
.jpg951KB155KB759ms0.5
.png2.00MB1.15MB867ms0.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));
       }
图片格式图片大小压缩之后大小需要时间(大约)压缩比例
.jpg951KB312KB420ms0.5
.png2.00MB352KB1139ms0.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);
图片格式图片大小压缩之后大小需要时间(大约)压缩比例
.jpg951KB312KB463ms0.5
.png2.00MB352KB1692ms0.5

还有一种方式

	Thumbnails.of(file)
               .scale(1f)
               .toFile(smallFileJpg);
图片格式图片大小压缩之后大小需要时间(大约)
.jpg951KB591KB540ms
.png2.00MB400KB1769ms

缩放图片

		Thumbnails.of(file)
              .scale(0.5f)
              .toFile(smallFileJpg);
图片格式图片大小压缩之后大小需要时间(大约)缩放比例
.jpg951KB136KB428ms0.5
.png2.00MB122KB1005ms0.5

所有的测试都会有误差200ms左右,读写速度可能会影响,上传服务器会受到网络的影响