摘要:最近遇到圖片處理的問題,借助了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// 生成文件名稱UUIDUUID 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作為水印的圖片如下: