SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼
1.需求
業(yè)務(wù)要求對(duì)png, jpg, jpeg, webp 格式圖片進(jìn)行等比例壓縮
2.開(kāi)發(fā)中遇到的問(wèn)題
使用 Thumbnails 包, 發(fā)現(xiàn)只能壓縮 jpg 和 jpeg , 不能壓縮webp
接著找到了 webp-imageio 解決webp , 又發(fā)現(xiàn) 這倆都不支持 png ,
接著找到了 OpenViewerFX 去處理png…
3. 實(shí)現(xiàn)代碼
3.1 pom 引用
<!--壓縮png-->
<dependency>
<groupId>org.jpedal</groupId>
<artifactId>OpenViewerFX</artifactId>
<version>6.6.14</version>
</dependency>
<!-- Thumbnailator: 圖片縮放和壓縮工具 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
<!-- TwelveMonkeys: 支持更多圖片格式 -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.9.4</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.9.4</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-webp</artifactId>
<version>3.9.4</version>
</dependency>
<!--壓縮webp-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0-alpha1</version>
</dependency>
<dependency>
<groupId>org.sejda.imageio</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
3.2 controller 代碼
我這里自己定死了生產(chǎn)圖片文件夾的路徑 , 各位大神按照自己實(shí)際的需求改動(dòng)
package com.example.controller;
import com.example.service.ImageCompressionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
/**
* @ClassName: ImageCompressionController
* @Description: TODO
* @Author: 趙狗
* @Date: 2024/8/23 15:04
*/
@RequestMapping("/imageApi")
@RestController
public class ImageCompressionController {
@Autowired
private ImageCompressionService imageCompressionService;
/**
* 圖片壓縮方法
* @param file
* @param quality
* @return
* @throws IOException
*/
@PostMapping("/compressBySize")
public String compressImageBySize(@RequestParam("file") MultipartFile file,
@RequestParam("quality") String quality
) throws IOException {
String outputPath = "F:\\images\\" + "compressed_size_" + file.getOriginalFilename();
File outputFile = new File(outputPath);
prepareOutputDirectory(outputFile);
File inputFile = convertMultipartFileToFile(file);
// 將quality轉(zhuǎn)為 float
float qualityFloat = Float.parseFloat(quality);
imageCompressionService.compressImageBySize(inputFile, outputFile,qualityFloat);
inputFile.delete();
return "File compressed successfully by size: " + outputFile.getAbsolutePath();
}
/**
* 判斷文件夾是否存在, 如果沒(méi)有則創(chuàng)建
* @param outputFile
*/
private void prepareOutputDirectory(File outputFile) {
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
}
/**
* 將MultipartFile轉(zhuǎn)換為File
* @param file
* @return
* @throws IOException
*/
private File convertMultipartFileToFile(MultipartFile file) throws IOException {
File convFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename());
file.transferTo(convFile);
return convFile;
}
public boolean isWebPSupported() {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("webp");
return readers.hasNext();
}
}
3.3 Service 代碼
package com.example.service;
import com.idrsolutions.image.png.PngCompressor;
import com.luciad.imageio.webp.WebPWriteParam;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.stereotype.Service;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
/**
* @ClassName: ImageCompressionService
* @Description: TODO
* @Author: 趙狗
* @Date: 2024/8/23 15:03
*/
@Service
public class ImageCompressionService {
private static final int DEFAULT_QUALITY = 80; // 默認(rèn)壓縮質(zhì)量為 80
/**
* 壓縮圖片方法
* @param inputFile
* @param outputFile
* @param quality
* @throws IOException
*/
public void compressImageBySize(File inputFile, File outputFile, float quality) throws IOException {
// 根據(jù)輸入文件的后綴名獲取文件格式
String formatName = getFileExtension(inputFile);
// 根據(jù)不同的文件格式,調(diào)用相應(yīng)的壓縮方法
if ("webp".equalsIgnoreCase(formatName)) {
// 對(duì)webp格式的圖片進(jìn)行壓縮
compressWebpImage(inputFile,outputFile,quality);
} else if("png".equalsIgnoreCase(formatName)){
// 對(duì)png格式的圖片進(jìn)行壓縮
compressPngImage(inputFile, outputFile);
} else {
// 對(duì)jpg或其他格式的圖片進(jìn)行壓縮,這里假設(shè)jpg的壓縮方法與其他格式不同
compressJpgImage(inputFile, outputFile, quality, formatName);
}
}
/**
* 壓縮jpg 以及 jpeg 格式的圖片方法
* @param inputFile
* @param outputFile
* @param quality
* @param formatName
* @throws IOException
*/
private void compressJpgImage(File inputFile, File outputFile, float quality, String formatName) throws IOException {
// 壓縮jpg 以及 jpeg 格式的圖片
Thumbnails.of(inputFile)
.scale(1) // 明確告訴庫(kù)不需要改變圖片尺寸
.outputQuality(quality) // 設(shè)置輸出圖片的質(zhì)量
.outputFormat(formatName) // 保持原有格式
.toFile(outputFile);
}
/**
* 壓縮png格式圖片方法
* @param inputFile
* @param outputFile
* @throws IOException
*/
private void compressPngImage(File inputFile, File outputFile) throws IOException {
PngCompressor.compress(inputFile, outputFile);
}
/**
* 壓縮webp格式圖片方法
* @param inputFile
* @param outputFile
* @param quality
* @throws IOException
*/
public void compressWebpImage(File inputFile, File outputFile, float quality) throws IOException {
// 讀取輸入的WebP圖像
BufferedImage image = ImageIO.read(inputFile);
// 獲取WebP格式的ImageWriter
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
if (!writers.hasNext()) {
throw new IllegalStateException("No WebP writer found");
}
ImageWriter writer = writers.next();
// 設(shè)置輸出流
try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile)) {
writer.setOutput(ios);
// 設(shè)置壓縮參數(shù)
WebPWriteParam writeParam = (WebPWriteParam) writer.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionType("Lossy");
writeParam.setCompressionQuality(quality); // 設(shè)置壓縮質(zhì)量,值范圍 0.0 ~ 1.0
// 寫(xiě)出壓縮后的WebP圖像
writer.write(null, new IIOImage(image, null, null), writeParam);
} finally {
writer.dispose();
}
}
/**
* 獲取圖片類型方法
* @param file
* @return
*/
private String getFileExtension(File file) {
String name = file.getName();
return name.substring(name.lastIndexOf('.') + 1).toLowerCase();
}
}
3.4 apifox 調(diào)用

3.5 效果圖
3.5.1 壓縮前:




3.5.2 壓縮后



以上就是SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot壓縮圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入理解JSON及其在Java中的應(yīng)用小結(jié)
json它是一種輕量級(jí)的數(shù)據(jù)交換格式,由于其易于閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成,因此廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換和配置文件,這篇文章主要介紹了深入理解JSON及其在Java中的應(yīng)用,需要的朋友可以參考下2023-12-12
springboot與redis的簡(jiǎn)單整合實(shí)例
Redis是一個(gè)緩存、消息代理和功能豐富的鍵值存儲(chǔ)。StringBoot提供了基本的自動(dòng)配置。這篇文章主要介紹了springboot與redis的簡(jiǎn)單整合實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01
詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法
本文主要介紹了詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
統(tǒng)一建模語(yǔ)言_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了統(tǒng)一建模語(yǔ)言的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06
詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)
這篇文章主要介紹了詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法,涉及Java針對(duì)MAC的遍歷獲取與字符串轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章給大家介紹了Myeclipse部署Tomcat的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-07-07

