在做项目的过程中发现需要上传很多图片,占用大量磁盘空间。
查阅资料,可以转成webp格式,并且图片的画质几乎没有影响。记录一下,以备后用!
导入pom文件
<dependency>
<groupId>org.sejda.imageio</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.1.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.sejda.imageio</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.1.6</version>
<scope>compile</scope>
</dependency>
核心代码
public static MultipartFile compressToWebp(MultipartFile sourceImage) throws IOException {
BufferedImage image = ImageIO.read(sourceImage.getInputStream());
// Obtain a WebP ImageWriter instance
ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();
// Configure encoding parameters
WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 设置有损压缩
writeParam.setCompressionType(writeParam.getCompressionTypes()[WebPWriteParam.LOSSY_COMPRESSION]);
//设置 80% 的质量. 设置范围 0-1
writeParam.setCompressionQuality(0.8f);
File file = new File(sourceImage.getOriginalFilename().substring(0, sourceImage.getOriginalFilename().lastIndexOf(".")) + ".webp");
FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(file);
// Configure the output on the ImageWriter
writer.setOutput(fileImageOutputStream);
// Encode
writer.write(null, new IIOImage(image, null, null), writeParam);
fileImageOutputStream.flush();
fileImageOutputStream.close();
try (FileInputStream inputStream = new FileInputStream(file)) {
return new MockMultipartFile(file.getName(), file.getName(), "image/webp", inputStream);
}finally {
//删除生成的临时文件
if (file.exists()) {
file.delete();
}
}
}
7597

被折叠的 条评论
为什么被折叠?



