添加依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
压缩一个5M的图片大约30秒左右
import net.coobird.thumbnailator.Thumbnails;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
public class PicUtil {
public static String resizeImageTo80K(String base64Img) throws Exception {
BufferedImage src = base64String2BufferedImage(base64Img);
BufferedImage output = Thumbnails.of(src).size(src.getWidth() / 3, src.getHeight() / 3).asBufferedImage();
String base64 = imageToBase64(output);
if (base64.length() - base64.length() / 8 * 2 > 80000) {
double d = 1d / (double) (base64.length() / 80000);
output = Thumbnails.of(output).scale(d).asBufferedImage();
base64 = imageToBase64(output);
}
return base64;
}
private static BufferedImage base64String2BufferedImage(String base64string) throws Exception {
BufferedImage image = null;
InputStream stream = BaseToInputStream(base64string);
image = ImageIO.read(stream);
return image;
}
private static InputStream BaseToInputStream(String base64string) throws Exception {
ByteArrayInputStream stream = null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes1 = decoder.decodeBuffer(base64string);
stream = new ByteArrayInputStream(bytes1);
return stream;
}
private static String imageToBase64(BufferedImage bufferedImage) throws Exception {
BASE64Encoder encoder = new BASE64Encoder();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", baos);
return new String(encoder.encode((baos.toByteArray())));
}
public static void main(String[] args) {
// String head = "data:image/jpeg;base64,";
String base64 = null;
try {
base64 = GetImageStr("D:\\IMG_20200812_075339.jpg");
System.out.println(base64.getBytes().length);
String s = resizeImageTo80K(base64);
System.out.println(s.getBytes().length);
} catch (Exception e) {
e.printStackTrace();
}
}
//图片转化成base64字符串
public static String GetImageStr(String imageName)
{//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
String imgFile = imageName;//待处理的图片
InputStream in = null;
byte[] data = null;
//读取图片字节数组
try
{
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
}
}