1. 程式人生 > >【Java例項】使用Thumbnailator生成縮圖(縮放、旋轉、裁剪、水印)

【Java例項】使用Thumbnailator生成縮圖(縮放、旋轉、裁剪、水印)

1 需求

表哥需要給兒子報名考試,系統要求上傳不超過30KB的圖片,而現在的手機隨手一拍就是幾MB的,怎麼弄一個才30KB的圖片呢?

一個簡單的辦法是在電腦上把圖片縮小,然後截圖小圖片,但現在的電腦螢幕解析度很高,而且截圖大小不好控制;同樣解析度在不同圖片格式下,大小也相差很大。試了一下微信截圖工具,輸出的圖片比較大。於是放棄了該辦法。

另一個辦法是通過其它工具來處理。找了圖片線上壓縮網站和一款手機軟體,發現在圖片小於一定大小時壓縮無效。如果再繼續找其它工具,簡直就是折騰且浪費時間,所以也放棄了該辦法。

最後,還是自己寫個程式碼把圖片按原比例壓縮成了29KB,使用Thumbnailator庫,兩三行程式碼搞定。

2 縮圖可以做什麼?

縮圖是應用極其廣泛的,像頭像、圖片訊息、商品圖片等,都會用到縮圖。

比如,當你有了一個新的微信好友,你就能看到他的頭像,一開始這個頭像是一個比原圖更小的縮圖。而你點選檢視原圖時,微信客戶端才會給你下載原圖。因為你並不會對每個人的頭像都感興趣,都會去檢視清晰的原圖,一個小小的縮圖已經能滿足了。這樣可以減輕網路傳輸的負擔,加快響應速度。

微信傳圖片和視訊也是同樣的道理,先給你傳一個比較小的預覽,你點選檢視原圖或視訊播放才給你傳更大的檔案。

3 縮圖的開源庫

縮圖的開源庫很多:

(1)Thumbnailator

GitHub:https://github.com/coobird/thumbnailator

不依賴外部庫,輕便高效,任何平臺適用,支援縮放、旋轉、擷取,支援水印。

(2)Imgscalr

GitHub:https://github.com/rkalla/imgscalr

全部基於 Java 2D,不依賴外部庫,輕便高效,任何平臺適用,支援縮放、旋轉、擷取,不支援水印。

本文主要講解Thumbnailator的使用,最新版本為0.4.8,maven引入如下:

<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
  <version>0.4.8</version>
</dependency>

4 常用操作

4.1 指定大小縮放

原圖為4:3比例的圖片,為4032x3024(圖片太大,網站無法上傳原圖),如下:

當使用指定大小方式進行縮放時,預設是保持原比例的。

//引數小且比例與原比例一樣
//則按引數輸出結果
Thumbnails.of(originalPic)
  .size(400, 300)
  .toFile(picturePath + "climb-up.size.400X300.jpeg");
//引數大且比例不等
//則按比例放大,取最小的值
Thumbnails.of(originalPic)
  .size(4400, 3400)
  .toFile(picturePath + "climb-up.size.4400X3300.jpeg");
//引數小且比例不等
//則按比例縮小,取最小的值
Thumbnails.of(originalPic)
  .size(200, 300)
  .toFile(picturePath + "climb-up.size.200X150.jpeg");
//不保持比例
//則按引數輸出結果
Thumbnails.of(originalPic)
  .size(200, 300)
  .keepAspectRatio(false)
  .toFile(picturePath + "climb-up.size.notKeepRatio.200X300.jpeg");
//強制設定大小
//則按引數輸出結果,與上個例子一樣
Thumbnails.of(originalPic)
  .forceSize(200, 300)
  .toFile(picturePath + "climb-up.forceSize.200X300.jpeg");

展示其中兩種結果:

(1)size(200, 300),結果為200X150的圖片,比例還是4:3。

(2)forceSize(200, 300),結果為200X300的圖片,如原比例不同,會有變形。

4.2 按比例進行縮放

按比例進行縮放是指按寬和高的比例同時縮放,看下面程式碼:

//比例小於1,縮小
//寬和高同時縮小為原來的0.1倍
Thumbnails.of(originalPic)
  .scale(0.1f)
  .toFile(picturePath + "climb-up.scale.403X302.jpeg");
//比例大於1,放大
//寬和高同時放大為原來的1.1倍
Thumbnails.of(originalPic)
  .scale(1.1f)
  .toFile(picturePath + "climb-up.scale.4435X3326.jpeg");

4.3 按角度旋轉

按角度旋轉時,角度為正數時,順時針;角度為負數時,逆時針。程式碼如下:

Thumbnails.of(originalPic)
  .size(400,300)
  .rotate(45)
  .toFile(picturePath + "climb-up.rotate.45.jpeg");

壓縮並旋轉後的結果圖片如下所示:

4.4 新增水印

新增水印也是十分方便,我們示例將水印放在右上角,程式碼如下:

Thumbnails.of(originalPic)
  .size(2000,1500)
  .watermark(Positions.TOP_RIGHT, ImageIO.read(
    new File(picturePath + "pkslow.size.400X300.jpeg")), 0.5f)
  .toFile(picturePath + "climb-up.watermark.jpeg");

加上水印後的圖片如下:

4.5 裁剪

程式碼如下:

Thumbnails.of(originalPic)
  .sourceRegion(Positions.TOP_RIGHT, 1800, 1800)
  .size(400, 400)
  .toFile(picturePath + "climb-up.crop.jpeg");

結果如下:

4.6 目錄下的檔案批量操作

這個功能還是非常有用,可以操作目錄下的所有圖片,並指定檔名輸出,如指定字首,程式碼如下:

Thumbnails.of(new File("/pictures/201912/").listFiles())
  .size(400, 400)
  .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

操作後的生成的結果如下:

5 總結

Thumbnailator庫操作方便,支援縮放、旋轉、裁剪、水印等功能,而且沒有其它依賴,值得了解學習。


歡迎關注公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。