首先看下缩放图片的核心代码,其实只有一行而已
//ins表示ByteArrayInputStream形式的图片
//scale中的数据就是缩小或者放大的比例,比如小于1则表示压缩,大于1表示放大
//out表示ByteArrayOutputStream形式的输出数据 也就是ins缩放后的图片数据
Thumbnails.of(ins).scale(0.99f).toOutputStream(out);
整体代码:
为了方便起见,我把整个代码全拿过来了,防止导错包,所以使用的话直接复制即可使用
说明我这里压缩的图片是base64格式的图片,已经去掉base64头部信息,关于如何去除头部信息已经获取图片大小可以参考以下链接
获取base64编码格式的图片大小
package com.web.framework.bbpp.module.yituhezisone.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import net.coobird.thumbnailator.Thumbnails;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class CompressImage {
public static void main(String[] args) {
String str = "base64编码格式的图片";
CompressImage com = new CompressImage();
//因为我使用的是base64编码格式的图片数据,所以需要先将base转为字节数组
byte[] decode = com.decode(str);
//将字节数组数据传入压缩方法中compressByteImage
str = com.compressByteImage(decode);
System.out.println("压缩后的图片数据"+str);
}
/**
* byte数组 转换为 Base64字符串
*/
public String encode(byte[] data) {
return new BASE64Encoder().encode(data);
}
/**
* Base64字符串 转换为 byte数组
*/
public byte[] decode(String base64) {
try {
return new BASE64Decoder().decodeBuffer(base64);
} catch (IOException e) {
e.printStackTrace();
}
return new byte[0];
}
public String compressByteImage(byte[] bytes) throws IOException {
//先将字节数组数据转为ByteArrayInputStream 形式
ByteArrayInputStream ins = new ByteArrayInputStream(bytes);
ByteArrayOutputStream out = new ByteArrayOutputStream();
//进行压缩 out就是压缩后的数据
Thumbnails.of(ins).scale(0.99f).toOutputStream(out);
//将ByteArrayOutputStream形式转为字节数组
byte[] data = out.toByteArray();
//将字节数组数据转为base64的格式
String imageStr = encode(data);
return imageStr;
}