PNG 转 WebP 的压缩率要高于 PNG 原图压缩率,同样支持有损与无损压缩
转换后的 WebP 体积大幅减少,图片质量也得到保障(同时肉眼几乎无法看出差异)
转换后的 WebP 支持 Alpha 透明和 24-bit 颜色数,不存在 PNG8 色彩不够丰富和在浏览器中可能会出现毛边的问题
WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一。
废话不多说直接上代码。
Maven依赖 必要
<dependency>
<groupId>com.github.gotson</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.2.2</version>
</dependency>
2. Java 转换工具类
package com.clearsky.common.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Component
public class UploadUtil {
//此处为自行在 application.yml 配置的目录,请根据需求酌情修改
@Value("${system.file}")
private String path;
//保存图片为 webp
public String saveImage(MultipartFile mFile) throws IOException {
var file = saveFile(mFile);//先将图片保存至本地
File webpFile = new File(path+file+".webp");
//注: BufferedImage 返回 null 是未在 pom.xml 中添加依赖
BufferedImage bufferedImage = ImageIO.read(new File(path+file));
ImageIO.write(bufferedImage,"webp", webpFile);
new File(path+file).deleteOnExit();//删除原文件
return file+".webp";
}
//保存文件至本地
public String saveFile(MultipartFile file) throws IOException {
String[] fileStr = file.getOriginalFilename().split("\\.");
String suffix = fileStr[fileStr.length - 1];
String fileName = UUID.randomUUID().toString().replace("-","");
String filePath = path+fileName+"."+suffix;
File desFile = new File(filePath);
if(!desFile.getParentFile().exists()){
desFile.mkdirs();
}
file.transferTo(desFile);
return fileName+"."+suffix;
}
}
注: 也可以直接将 MultipartFile 转换为 File 后直接保存 webp 格式文件.