前端上传的MultipartFile file
//创建临时文件
OutputStream stream = null;
File toFile = null;
try {
toFile = File.createTempFile("temp_file", ".jpg");
toFile.deleteOnExit();
stream = new FileOutputStream(toFile);
stream.write(file.getBytes());
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// Nothing sane to do
}
}
}
/**
* 根据指定大小和指定精度压缩图片
*
* @param file file 文件
* @param desFileSize 指定图片大小,单位kb
* @param accuracy 精度,递归压缩的比率,建议小于0.9
* @param desMaxWidth 目标最大宽度
* @param desMaxHeight 目标最大高度
* @return 目标文件路径
*/
public static byte[] commpressPicForScale(File file, long desFileSize, double accuracy, int desMaxWidth, int desMaxHeight) throws IOException {
long srcFileSize = file.length();
//获取图片信息
BufferedImage bim = ImageIO.read(file);
int srcWidth = bim.getWidth();
int srcHeight = bim.getHeight();
//先转换成jpg
Thumbnails.Builder builder = Thumbnails.of(file).outputFormat("jpg");
// 指定大小(宽或高超出会才会被缩放)
if (srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
builder.size(desMaxWidth, desMaxHeight);
} else {
//宽高均小,指定原大小
builder.size(srcWidth, srcHeight);
}
// 写入到内存
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
builder.toOutputStream(baos);
// 递归压缩,直到目标文件大小小于desFileSize
// 输出到文件
return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
}
private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
// File srcFileJPG = new File(desPath);
long srcFileSizeJPG = bytes.length;
// 2、判断大小,如果小于 xxx kb,不压缩;如果大于等于 xxx kb,压缩
if (srcFileSizeJPG <= desFileSize * 1024) {
return bytes;
}
// 计算宽高
BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
int srcWdith = bim.getWidth();
int srcHeigth = bim.getHeight();
int desWidth = new BigDecimal(srcWdith).multiply(
new BigDecimal(accuracy)).intValue();
int desHeight = new BigDecimal(srcHeigth).multiply(
new BigDecimal(accuracy)).intValue();
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
}