強大!Spring Boot 圖片處理工具,實現縮放,水印,旋轉等功能僅需一行代碼
環境:SpringBoot3.2.5
1. 簡介
在Web項目開發中,對用戶上傳的圖片進行處理是非常有必要的。對于圖片的處理,常見的需求包括縮放、添加水印等。
縮放功能可以根據實際需求調整圖片的大小,以適應不同的顯示場景。通過合理的縮放,不僅可以節省存儲空間,還能提升加載速度,優化用戶體驗。
水印功能則是一種有效的版權保護手段。通過在圖片上添加文字或圖標水印,可以明確標識圖片的歸屬和來源,防止被惡意盜用。
在Java環境中創建高質量的縮略圖可能頗具挑戰性,要求開發者掌握Image I/O API、Java 2D API以及圖像處理和縮放技術等復雜知識。然而,你無需為此擔憂!本篇文章將介紹一個非常牛逼的開源組件Thumbnailator。
Thumbnailator的流暢接口(Fluent Interface)可以用來在一步簡單的操作中完成相當復雜的縮略圖處理任務。
準備環境,引入如下依賴:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
不依賴其它,只需引入該包即可完整各種復雜的圖片出來。
2. 實戰案例
2.1 創建縮略圖
Thumbnails
.of(new File("d:\\images\\7.png"))
.size(160, 160)
.toFile(new File("d:\\images\\output\\7.png")) ;
該示例中,將原圖大小縮放到160 * 160 然后輸出到output目錄下。最終圖片對比如下:
雖然給定的縮放大小都是160,但是最終生成的是等比例的大小,但是不會超過160。
2.2 添加水印
Thumbnails.of(new File("d:\\images\\7.png"))
.size(200, 200)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("d:\\images\\water.png")), 0.5f)
.outputQuality(0.8)
.toFile(new File("d:\\images\\output\\7_watermark.png"));
在該示例中,首先調整了圖片大小,接著在右下角放置一個半透明的水印,最后以80%的壓縮質量設置保存為7_watermark.png。最終生成效果:
2.3 旋轉圖片
Thumbnails.of(new File("d:\\images\\7.png"))
.scale(1)
.rotate(180)
.toFile(new File("d:\\images\\output\\7_rotate.png"));
該示例中,我們將圖片旋轉了180°,最終效果:
2.4 強制縮略圖大小
在上面的示例中,我們指定了縮放圖片的大小,但是最終生成的圖片還是等比例的,這樣的結果是寬或高不會高出指定的大小,并沒有嚴格的限定在指定的大小。
Thumbnails.of(new File("d:\\images\\7.png"))
.size(200, 200)
.keepAspectRatio(false)
.toFile(new File("d:\\images\\output\\7_keepratio.png"));
最終生成的效果:
嚴格按照指定的大小生成圖片。你也可以如下操作
Thumbnails.of(new File("d:\\images\\7.png"))
.forceSize(200, 200)
.toFile(new File("d:\\images\\output\\7_keepratio.png"));
同樣能按照指定的大小輸出。
2.5 通過指定的因子縮放
Thumbnails.of(new File("d:\\images\\7.png"))
.scale(0.25)
.toFile(new File("d:\\images\\output\\7_scale.png"));
通過scale方法設置縮放的比,最終效果:
2.6 批量生成縮略圖
我們一次性可以出來多個圖片,并指定輸出的目錄。
File destinationDir = new File("d:\\images\\output");
Thumbnails.of("d:\\images\\1.png", "d:\\images\\2.png", "d:\\images\\3.png")
.size(200, 200)
.toFiles(destinationDir, Rename.PREFIX_DOT_THUMBNAIL);
該示例將1,2,3圖片一次性按照設置生成縮略圖,然后輸出到output目錄下,效果如下:
這里生成縮略圖的命名策略是自動在原文件名前添加thumbnail.前綴,你也可以設置為:Rename.NO_CHANGE,這樣圖片將按照原文件名輸出。
2.7 與Spring Boot整合
我們這里演示一個圖片上傳后生成縮略圖進行輸出的示例。
@PostMapping("/upload")
public void upload(MultipartFile file, HttpServletResponse response) throws Exception {
InputStream is = file.getInputStream() ;
BufferedImage bi = Thumbnails.of(is)
.size(200, 200)
.asBufferedImage() ;
response.setContentType("image/png");
response.setHeader("Content-Disposition", "inline; filename=image.png");
ImageIO.write(bi, "png", response.getOutputStream()) ;
}
該示例中,將上傳的圖片進行縮放后,返回BufferedImage對象,直接直接將該對象進行輸出,最終效果:
圖片