上传文件,压缩临时图片,不做本地图片存储,用于传输

前端上传的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);
}

 

 
posted @ 2020-08-24 11:43  缘来是妳啊  阅读(69)  评论(0编辑  收藏  举报