【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(圖片太大,網站無法上傳原圖),如下:

file

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

//參數小且比例與原比例一樣
//則按參數輸出結果
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。

file

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

file

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");

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

file

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");

加上水印後的圖片如下:

file

4.5 裁剪

代碼如下:

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

結果如下:

file

4.6 目錄下的文件批量操作

這個功能還是非常有用,可以操作目錄下的所有圖片,並指定文件名輸出,如指定前綴,代碼如下:

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

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

file

5 總結

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

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

file

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章