強(qiáng)大!Spring Boot 圖片處理工具,實(shí)現(xiàn)縮放,水印,旋轉(zhuǎn)等功能僅需一行代碼
環(huán)境:SpringBoot3.2.5
1. 簡(jiǎn)介
在Web項(xiàng)目開發(fā)中,對(duì)用戶上傳的圖片進(jìn)行處理是非常有必要的。對(duì)于圖片的處理,常見的需求包括縮放、添加水印等。
縮放功能可以根據(jù)實(shí)際需求調(diào)整圖片的大小,以適應(yīng)不同的顯示場(chǎng)景。通過合理的縮放,不僅可以節(jié)省存儲(chǔ)空間,還能提升加載速度,優(yōu)化用戶體驗(yàn)。
水印功能則是一種有效的版權(quán)保護(hù)手段。通過在圖片上添加文字或圖標(biāo)水印,可以明確標(biāo)識(shí)圖片的歸屬和來源,防止被惡意盜用。
在Java環(huán)境中創(chuàng)建高質(zhì)量的縮略圖可能頗具挑戰(zhàn)性,要求開發(fā)者掌握Image I/O API、Java 2D API以及圖像處理和縮放技術(shù)等復(fù)雜知識(shí)。然而,你無需為此擔(dān)憂!本篇文章將介紹一個(gè)非常牛逼的開源組件Thumbnailator。
Thumbnailator的流暢接口(Fluent Interface)可以用來在一步簡(jiǎn)單的操作中完成相當(dāng)復(fù)雜的縮略圖處理任務(wù)。
準(zhǔn)備環(huán)境,引入如下依賴:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
不依賴其它,只需引入該包即可完整各種復(fù)雜的圖片出來。
2. 實(shí)戰(zhàn)案例
2.1 創(chuàng)建縮略圖
Thumbnails
.of(new File("d:\\images\\7.png"))
.size(160, 160)
.toFile(new File("d:\\images\\output\\7.png")) ;
該示例中,將原圖大小縮放到160 * 160 然后輸出到output目錄下。最終圖片對(duì)比如下:
雖然給定的縮放大小都是160,但是最終生成的是等比例的大小,但是不會(huì)超過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"));
在該示例中,首先調(diào)整了圖片大小,接著在右下角放置一個(gè)半透明的水印,最后以80%的壓縮質(zhì)量設(shè)置保存為7_watermark.png。最終生成效果:
2.3 旋轉(zhuǎn)圖片
Thumbnails.of(new File("d:\\images\\7.png"))
.scale(1)
.rotate(180)
.toFile(new File("d:\\images\\output\\7_rotate.png"));
該示例中,我們將圖片旋轉(zhuǎn)了180°,最終效果:
2.4 強(qiáng)制縮略圖大小
在上面的示例中,我們指定了縮放圖片的大小,但是最終生成的圖片還是等比例的,這樣的結(jié)果是寬或高不會(huì)高出指定的大小,并沒有嚴(yán)格的限定在指定的大小。
Thumbnails.of(new File("d:\\images\\7.png"))
.size(200, 200)
.keepAspectRatio(false)
.toFile(new File("d:\\images\\output\\7_keepratio.png"));
最終生成的效果:
嚴(yán)格按照指定的大小生成圖片。你也可以如下操作
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方法設(shè)置縮放的比,最終效果:
2.6 批量生成縮略圖
我們一次性可以出來多個(gè)圖片,并指定輸出的目錄。
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圖片一次性按照設(shè)置生成縮略圖,然后輸出到output目錄下,效果如下:
這里生成縮略圖的命名策略是自動(dòng)在原文件名前添加thumbnail.前綴,你也可以設(shè)置為:Rename.NO_CHANGE,這樣圖片將按照原文件名輸出。
2.7 與Spring Boot整合
我們這里演示一個(gè)圖片上傳后生成縮略圖進(jìn)行輸出的示例。
@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()) ;
}
該示例中,將上傳的圖片進(jìn)行縮放后,返回BufferedImage對(duì)象,直接直接將該對(duì)象進(jìn)行輸出,最終效果:
圖片