摘要:最近遇到图片处理的问题,借助了Thumbnailator库,记录下使用步骤如下……
图片处理,JDK中也提供了对应的工具类,不过处理较麻烦,Thumbnailator 是Google一个 开源Java 图像处理库,用于简化 Java 中对图像进行缩放、裁剪和添加水印等操作。GitHub - coobird/thumbnailator: Thumbnailator - a thumbnail generation library for JavaThumbnailator - a thumbnail generation library for Java - coobird/thumbnailatorhttps://github.com/coobird/thumbnailator 通过 Thumbnailator开发人员可以轻松地对图像进行各种处理,而不必关心复杂的细节,参考Thumbnailator给出的Examples很详细的介绍了其多个使用功能。
1. Thumbnailator介绍
Thumbnails.of() 方法就是 Thumbnailator 提供的一个入口方法,用于创建一个图像处理对象,其对图片的处理支持链式操作,使用Thumbnailator大致可完成如下操作:
- 生成缩略图: 通过指定目标尺寸,可以轻松地生成原始图像的缩略图;
- 添加水印: 可以在图像上方便地添加文本或其他图像作为水印;
- 旋转和翻转: 支持对图像进行旋转和翻转操作;
- 批量处理: 能够方便地对多个图像进行批量处理,生成一组缩略图;
- 格式转换: 可以将图像转换为不同的格式,如 JPEG、PNG 等;
- 链式调用: 支持链式调用,可以在一行代码中实现多个操作,使代码更加简洁和易读。
// 切割
Thumbnails.of(path + "caomei.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 200,200).size(200,200).toFile(path+"crop.jpg");
// 缩放: 分为按比例缩放scale和按长宽缩放size
Thumbnails.of(path + "caomei.jpg").scale(0.7).toFile(path+"scale1.jpg");
Thumbnails.of(path + "caomei.jpg").scale(1.5).toFile(path+"scale2.jpg");
Thumbnails.of(path + "caomei.jpg").size(500, 500).keepAspectRatio(false).toFile(path+"size1.jpg");
// keepAspectRatio(true)等比缩放
Thumbnails.of(path + "caomei.jpg").size(500,500).keepAspectRatio(true).toFile(path+"size2.jpg");
// 旋转
Thumbnails.of(path + "caomei.jpg").size(500,500).keepAspectRatio(true).rotate(90).toFile(path+"size2.jpg");
2. 项目中使用Thumbnailator
项目中使用Thumbnailator步骤也很简单,下面实现上传图片接口,将缩放图片,并返回图片链接。
首先,依旧是pom.xml中配置,并使用Maven引入依赖
<!-- 图片处理依赖 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
然后,就可以在具体方法中使用Thumbnailator。例如,在上传图片时,设置图片尺寸,添加水印并使用新名称保存,实现如下:
// 为了在图片地址中保存URL,传入HttpServletRequest
@PostMapping("admin/upload/image")
public ApiRestResponse uploadImage(HttpServletRequest httpServletRequest, @RequestParam("file") MultipartFile file) throws IOException {
// 获取上传文件原始名称
String fileName = file.getOriginalFilename(); //fileName: logo.png
// 获取图片文件格式,后缀
String suffixName = fileName.substring(fileName.lastIndexOf(".")); // suffixName: .png
// 生成文件名称UUID
UUID uuid = UUID.randomUUID();
String newFileName = uuid.toString() + suffixName; // newfileName: b93fee5a-271c-4922-b57e-99b5c3413d82.png
// 创建文件夹
File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
if (!fileDirectory.exists()) { //文件夹不存在,则创建fileDirectory.mkdir()
if (!fileDirectory.mkdir()) {
throw new ImoocMallException(ImoocMallExceptionEnum.MKDIR_FAILED);
}
}
try {
file.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
}
// 对目标文件进行缩略图处理,并添加水印
Thumbnails.of(destFile) // 选择目标文件
.size(Constant.IMAGE_SIZE, Constant.IMAGE_SIZE) // 设置缩略图大小
.watermark(
Positions.BOTTOM_RIGHT, // 设置水印位置为右下角
ImageIO.read(new File(Constant.FILE_UPLOAD_DIR + Constant.WATER_MARK_JPG)), // 读取水印图片
Constant.IMAGE_OPACITY // 设置水印透明度
)
.toFile(new File(Constant.FILE_UPLOAD_DIR + newFileName)); // 输出处理后的文件到指定路径
try {
return ApiRestResponse.success(getHost(new URI(httpServletRequest.getRequestURL()+""))+"/images/"+newFileName);
} catch (URISyntaxException e) {
return ApiRestResponse.error(ImoocMallExceptionEnum.UPLOAD_FAILED);
}
}
通过上述方法可以缩放并添加CSDN作为水印的图片如下: