?前言:
????????對于javaweb服務端開發人員,圖片資源的管理總是繞不開的一環。很多網站上都會提供上傳圖片這個功能,而現代數碼設備拍攝出來的都是高清圖片,分辨率很高,占用的空間也很大。物理存儲的問題還算容易解決,但是網絡帶寬太緊張了。一個頁面動則就幾十M,那加載速度,想想也是夠了,所以圖片的壓縮就必不可少了,對于圖片的加工,前后端都可以實現,這里講解一下后端實現圖片加工的工具庫——Thumbnailator
簡介:
????????Thumbnailator 是一個用來生成圖像縮略圖的 Java 類庫,通過很簡單的代碼即可生成圖片縮略圖,也可直接對一整個目錄的圖片生成縮略圖。
????????Thumbnailator 能做什么?
????????Thumbnailator是一款高性能的java縮略圖類庫。 支持的處理操作:圖片縮放,區域裁剪,水印,旋轉,保持比例。
快速入門:
引入依賴:
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>
API示例:
圖片壓縮
方式一:等比例壓縮
Thumbnails.of("原圖文件的路徑").scale(0.5) // 壓縮的比例.toFile("壓縮后文件的路徑");
方式二:指定px值的等比例壓縮(不會破壞圖片比例,因此如果px值不成比例會與預期有小差距)
Thumbnails.of("原圖文件的路徑").size(100, 75) // 長寬的px值.toFile("壓縮后文件的路徑");
方式三:非等比例壓縮(會破壞圖片比例,即圖片會受指定的比例變型)
Thumbnails.of("原圖文件的路徑").scale(1.0, 0.5) // 長寬的比例,非等比例,會導致圖片變型.toFile("壓縮后文件的路徑");
圖片旋轉
????????注意:這里的圖片旋轉要伴隨著一個圖片的壓縮變量,如果僅僅只是實現圖片旋轉,可以把壓縮比例寫為 1
Thumbnails.of("原圖文件的路徑").scale(0.8) // 等比例縮放的比例.rotate(90) // 旋轉的角度,順時針.toFile("轉換后文件的路徑");
Thumbnails.of(“原圖文件的路徑”).size(40,40) // 等比例縮放的具體長寬px值.rotate(90) // 順時針旋轉的角度.toFile(“轉換后文件的路徑”);
scale,size 必須有一個有值
加水印?
File image = new File("水印圖片地址");
Thumbnails.of("原圖文件的路徑").scale(0.8) // 原圖壓縮的比例// Watermark:添加水印 watermark(位置,水印圖,透明度).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(image), 0.5f).toFile("轉換后文件的路徑");
修改文件格式
Thumbnails.of(“原圖文件的路徑”).scale(1f) // 原圖等比例縮放的比例,1f表示不縮放,不能省略.outputFormat(“jpg”) // 轉換后的格式.toFile(“轉換后文件的路徑”); // 這里要注意哦,路徑最后要寫上“生成的文件名.后綴”
????????outputFormat:設置轉換后圖片格式,之前聽說該屬性設置為png時,scale縮放屬性無效,測試用0.4.8的版本已經能正常縮放了
不改變寬高,壓縮大小?
Thumbnails.of("原圖文件的路徑").scale(1f) // 原圖等比例縮放的比例,1f表示不縮放,不能省略 .outputQuality(0.5f) // 輸出的圖片質量,范圍:0.0~1.0,1為最高質量,大小最大.toFile("壓縮后文件的路徑");
綜合實戰:
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.name.Rename;
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** @author wzx* @version 1.0* @description 生成縮略圖和水印非常好用,具體幫助文檔 https://github.com/coobird/thumbnailator/wiki/Maven* 縮略圖* 水印* 選擇* 格式轉換* @Create 2023/8/22*/
public class ThumbnailatorDmo {/*** 使用給定的圖片生成指定大小的圖片*/private static void generateFixedSizeImage(){try {Thumbnails.of("data/meinv.jpg").size(80,80).toFile("data/newmeinv.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 對原圖加水印,然后順時針旋轉90度,最后壓縮為80%保存*/private static void generateRotationWatermark(){try {Thumbnails.of("data/2016010208.jpg").size(160,160). // 縮放大小rotate(90). // 順時針旋轉90度watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("data/newmeinv.jpg")),0.5f). //水印位于右下角,半透明outputQuality(0.8). // 圖片壓縮80%質量toFile("data/2016010208_new.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 轉換圖片格式,將流寫入到輸出流*/private static void generateOutputstream(){try(OutputStream outputStream = new FileOutputStream("data/2016010208_outputstream.png")) { //自動關閉流Thumbnails.of("data/2016010208.jpg").size(500,500).outputFormat("png"). // 轉換格式toOutputStream(outputStream); // 寫入輸出流} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 按比例縮放圖片*/private static void generateScale(){try {Thumbnails.of("data/2016010208.jpg").//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 圖片縮放80%, 不能和size()一起使用outputQuality(0.8). // 圖片質量壓縮80%toFile("data/2016010208_scale.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 生成縮略圖到指定的目錄*/private static void generateThumbnail2Directory(){try {Thumbnails.of("data/2016010208.jpg","data/meinv.jpg").//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 圖片縮放80%, 不能和size()一起使用toFiles(new File("data/new/"), Rename.NO_CHANGE);//指定的目錄一定要存在,否則報錯} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 將指定目錄下所有圖片生成縮略圖*/private static void generateDirectoryThumbnail(){try {Thumbnails.of(new File("data/new").listFiles()).//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 圖片縮放80%, 不能和size()一起使用toFiles(new File("data/new/"), Rename.SUFFIX_HYPHEN_THUMBNAIL);//指定的目錄一定要存在,否則報錯} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}
}