/**
* 图片压缩
* @param inputImage
* @param formatName
* @param quality
* @return
* @throws IOException
*/
public static InputStream compressImage(InputStream inputImage, String formatName, float quality) throws Exception {
BufferedImage image = ImageIO.read(inputImage);
// 解决压缩后图片发红问题
//设置一个同宽高的基本图像
BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
//空图像的画布
Graphics2D g = bimage.createGraphics();
//绘制图像
g.drawImage(image, 0, 0, null);
//释放资源
g.dispose();
// 获取特定格式的图像写入器(比如JPG JPEG),并获取默认的写入参数,用于设置图像的压缩方式和质量
ImageWriter writer = ImageIO.getImageWritersByFormatName(formatName).next();
ImageWriteParam param = writer.getDefaultWriteParam();
// 设置压缩模式为 MODE_EXPLICIT,表示要显式地设置压缩参数,通过 setCompressionQuality() 方法设置压缩质量
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 压缩质量0-1
param.setCompressionQuality(quality);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 输入图片并关闭
writer.setOutput(ImageIO.createImageOutputStream(outputStream));
writer.write(null, new IIOImage(bimage, null, null), param);
writer.dispose();
return new ByteArrayInputStream(outputStream.toByteArray());
}
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream(new File("C:\\Download\\FFCE5F9B@1D42265(06-11-15-22-07).jpg"));
InputStream compressedImage = compressImage(fis, "jpg", 0.3f);
// BufferedImage image = ImageIO.read(compressedImage);
// // 将图片保存到文件系统
// File outputFile = new File("C:\\Download\\output.jpg");
// ImageIO.write(image, "jpg", outputFile);
MultipartFile file = new MockMultipartFile("file", "1.jpg", MediaType.MULTIPART_FORM_DATA_VALUE, compressedImage);
System.out.println(file.getSize());
}