使用 Java 進行有損和無損圖像壓縮
一、簡介
在本教程中,我們將探討如何使用 Java 壓縮圖像。我們將從使用 Java 中用於圖像壓縮的內置庫壓縮圖像開始。然後我們將介紹替代庫 Apache Commons Imaging。
讓我們從了解圖像壓縮開始。
2. 什麼是圖像壓縮?
圖像壓縮使我們能夠在不顯著影響其視覺質量的情況下減小圖像文件的大小。有兩種類型的壓縮。首先,我們使用有損壓縮來接受降低的圖像質量,同時實現更小的文件大小。例如,我們有用於有損壓縮的 JPEG 和 WebP 格式。其次,我們使用無損壓縮來在壓縮過程中保留數據和信息。例如,在無損壓縮過程中使用 PNG 和 GIF 格式。
現在,我們將重點介紹使用 JPEG 格式的有損壓縮,因為它是 Internet 上最常用的格式。之後,我們將檢查如何壓縮 PNG 圖像,稱為 PNG 圖像優化。
3. 使用 Java 圖像 I/O 壓縮圖像
首先,我們將使用 Java Image I/O的內置 API 來讀取和寫入圖像。它支持各種圖像格式,包括 JPEG、PNG、BMP 和 GIF。讓我們看看如何使用 Java Image I/O 壓縮圖像:
File inputFile = new File("input_image.jpg");
BufferedImage inputImage = ImageIO.read(inputFile);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
File outputFile = new File("output.jpg");
ImageOutputStream outputStream = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(outputStream);
ImageWriteParam params = writer.getDefaultWriteParam();
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
params.setCompressionQuality(0.5f);
writer.write(null, new IIOImage(inputImage, null, null), params);
outputStream.close();
writer.dispose();
首先,我們從資源文件中讀取圖像。然後,我們為 JPG 格式創建一個ImageWriter
,設置這個寫入器的輸出文件。在寫入圖像之前,我們創建ImageWriteParam
對象來定義壓縮模式和壓縮質量為 50%。最後,我們寫入圖像,關閉輸出流,並清理寫入器。
例如,通過將示例圖像壓縮 50%,我們幾乎將文件大小從 790KB 減少到 656KB,略低於初始大小的 83%。因此,圖片質量的變化並不明顯:
4. 使用縮略圖庫壓縮圖像
Thumbnails 庫是一個簡單易用的庫,用於調整圖像大小和壓縮圖像。讓我們首先將庫添加到我們的pom.xml
中:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.19</version>
</dependency>
讓我們看看如何使用Thumbnails
類壓縮圖像:
File input = new File("input_image.jpg");
File output = new File("output.jpg");
Thumbnails.of(input)
.scale(1)
.outputQuality(0.5)
.toFile(output);
在這裡, scale(1)
方法保持原始圖像尺寸,而outputQuality(0.5)
將輸出質量設置為 50%。
5. 使用 Pngtastic 庫壓縮圖片
PNG 優化是一種專門為 PNG 圖像設計的壓縮。我們將使用Pngtastic 庫來優化 PNG 圖像。首先,讓我們將最新的存儲庫添加到我們的pom.xml
中:
<dependency>
<groupId>com.github.depsypher</groupId>
<artifactId>pngtastic</artifactId>
<version>1.7</version>
</dependency>
最後,我們可以使用PngOptimizer
類來壓縮 PNG 文件:
PngImage inputImage = new PngImage(Files.newInputStream(Paths.get(inputPath)));
PngOptimizer optimizer = new PngOptimizer();
PngImage optimized = optimizer.optimize(inputImage);
OutputStream output = Files.newOutputStream(Paths.get(outputPath));
optimized.writeDataOutputStream(output);
我們使用.optimize()
方法讓庫決定最佳壓縮。作為無損壓縮,很難顯著減小圖像的大小。在這裡,我們將大小從 500 KB 減少到 481 KB。
六,結論
在本文中,我們介紹了兩種使用 Java 進行有損壓縮的方法:內置的 Java Image I/O API 和 Apache Commons Imaging 庫。然後,我們使用 Pngtastic 庫對 PNG 圖片進行無損壓縮。
與往常一樣,可以在 GitHub 上找到示例的完整源代碼。