需求:
图片传给第三方,但是有宽带限制大于40KB的图片都需要做处理,进行压缩
实现方式:
通过HuTool工具包下的ImgUtil工具类来实现
Hutool工具类API地址:Hutool工具类API地址
ImgUtil工具地址:ImgUtil工具地址
工具类说明:
//提供两种重载方法:其中一个是按照长宽缩放,另一种是按照比例缩放。
ImgUtil.scale(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
0.5f//缩放比例
);
实现步骤:
1,引入maven坐标
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.4</version>
</dependency>
2,工具类:
工具类包含了一个根据base64数据计算图片大小的方法,具体从哪里抄来的找不见了,回头看到附上链接- -
import cn.hutool.core.img.ImgUtil;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
/**
* Created in 2021/7/14 10:23
* 图片相关工具类
* @author
*/
public class ImageUtil {
/**
* 计算图片的大小,返回单位为KB
* @param imageBase64Str 图片base64数据
* @return 图片大小
*/
public static Integer imageSize(String imageBase64Str){
//1.找到等号,把等号也去掉(=用来填充base64字符串长度用)
Integer equalIndex= imageBase64Str.indexOf("=");
if(imageBase64Str.indexOf("=")>0) {
imageBase64Str=imageBase64Str.substring(0, equalIndex);
}
//2.原来的字符流大小,单位为字节
Integer strLength=imageBase64Str.length();
System.out.println("imageBase64Str Length = "+strLength);
//3.计算后得到的文件流大小,单位为字节
Integer size=strLength-(strLength/8)*2;
return bytesToKB(size);
}
/**
* byte(字节)根据长度转成kb(千字节)
* @param bytes
* @return
*/
public static Integer bytesToKB(long bytes) {
BigDecimal filesize = new BigDecimal(bytes);
BigDecimal megabyte = new BigDecimal(1024 * 1024);
BigDecimal kilobyte = new BigDecimal(1024);
float returnValue = filesize.divide(kilobyte, 1, BigDecimal.ROUND_DOWN).floatValue();
return (int)returnValue ;
}
/**
* 根据图片的base64数据缩放图片
* @param base64ImagStr 原图的base64字符换
* @param imageType 图片类型
* @return
*/
public static String scaleImage(String base64ImagStr,String imageType){
BufferedImage bufferedImage = ImgUtil.toImage(base64ImagStr);
// 这块也可以直接通过传入一个image对象,
Image scaleImage = ImgUtil.scale(bufferedImage, 0.2f);
String resultBase64Str = ImgUtil.toBase64(scaleImage, imageType);
Integer imageSizeBase64 = imageSize(resultBase64Str);
if(imageSizeBase64 > 40){
scaleImage(resultBase64Str,imageType);
}
return resultBase64Str;
}
}
准确的说,缩放图片的代码只有如下几行:
BufferedImage bufferedImage = ImgUtil.toImage(base64ImagStr);
Image scaleImage = ImgUtil.scale(bufferedImage, 0.2f);
String resultBase64Str = ImgUtil.toBase64(scaleImage, imageType);
部分方法说明:
官方的API中提供的scale方法是需要一个Image对象和缩放比例,可以通过FiltUtil直接传入绝对路径获取到(最上面的官方API有说明),但是base64的话,需要通过其他方式来处理
ImgUtil下提供了toImage这个方法,返回的是一个Image接口的实现子类对象,因此可以用它来转一个base64的图片为一个Image对象
缩放完成之后,会返回一个Image实现子类对象,同样可以通过ImgUtil下的toBase64来返回对应的base64数据