SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼
1.需求
業(yè)務(wù)要求對(duì)png, jpg, jpeg, webp 格式圖片進(jìn)行等比例壓縮
2.開發(fā)中遇到的問題
使用 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(); } /** * 判斷文件夾是否存在, 如果沒有則創(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) // 明確告訴庫不需要改變圖片尺寸 .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 // 寫出壓縮后的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)文章
Spring Cloud Gateway組件的三種使用方式實(shí)例詳解
Spring Cloud Gateway是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān)旨在為微服務(wù)框架提供一種簡單而有效的統(tǒng)一的API 路由管理方式,統(tǒng)一訪問接口,這篇文章主要介紹了Spring Cloud Gateway組件的三種使用方式,需要的朋友可以參考下2024-01-01MyBatis-Plus輸出完整SQL(帶參數(shù))的三種方案
當(dāng)我們使用 mybatis-plus 時(shí),可能會(huì)遇到SQL 不能直接執(zhí)行,調(diào)試也不方便的情況,那么,如何打印完整 SQL(帶參數(shù))呢?本篇文章將介紹 3 種實(shí)現(xiàn)方式,并對(duì)比它們的優(yōu)缺點(diǎn),需要的朋友可以參考下2025-02-02淺談java實(shí)現(xiàn)背包算法(0-1背包問題)
本篇文章主要介紹了淺談java實(shí)現(xiàn)背包算法(0-1背包問題) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08SpringBoot實(shí)現(xiàn)登錄攔截器的方法詳解
其實(shí)spring?boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器功能,需要的朋友可以參考下2022-07-07SpringBoot自動(dòng)裝配之@Import深入講解
由于最近的項(xiàng)目需求,需要在把配置類導(dǎo)入到容器中,通過查詢,使用@Import注解就能實(shí)現(xiàn)這個(gè)功能,@Import注解能夠幫我們吧普通配置類(定義為Bean的類)導(dǎo)入到IOC容器中2023-01-01SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題
這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07