最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼

 更新時(shí)間:2024年08月26日 09:22:54   作者:三過食堂而不入  
這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

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)文章

  • 深入理解JSON及其在Java中的應(yīng)用小結(jié)

    深入理解JSON及其在Java中的應(yīng)用小結(jié)

    json它是一種輕量級(jí)的數(shù)據(jù)交換格式,由于其易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,因此廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換和配置文件,這篇文章主要介紹了深入理解JSON及其在Java中的應(yīng)用,需要的朋友可以參考下
    2023-12-12
  • springboot與redis的簡(jiǎn)單整合實(shí)例

    springboot與redis的簡(jiǎn)單整合實(shí)例

    Redis是一個(gè)緩存、消息代理和功能豐富的鍵值存儲(chǔ)。StringBoot提供了基本的自動(dòng)配置。這篇文章主要介紹了springboot與redis的簡(jiǎn)單整合實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01
  • java圖形界面編程實(shí)戰(zhàn)代碼

    java圖形界面編程實(shí)戰(zhàn)代碼

    這篇文章主要介紹了java圖形界面編程實(shí)戰(zhàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • java文件操作之Path,Paths,Files

    java文件操作之Path,Paths,Files

    Java7中文件IO發(fā)生了很大的變化,專門引入了很多新的類,下面給大家分享用Files作為一個(gè)操作類的實(shí)例,需要的朋友可以參考
    2017-04-04
  • 詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法

    詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法

    本文主要介紹了詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 統(tǒng)一建模語言_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    統(tǒng)一建模語言_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了統(tǒng)一建模語言的相關(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)

    這篇文章主要介紹了詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法

    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
  • Mybatis ResultType如何處理返回類型

    Mybatis ResultType如何處理返回類型

    這篇文章主要介紹了Mybatis ResultType如何處理返回類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章給大家介紹了Myeclipse部署Tomcat的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-07-07

最新評(píng)論

抚州市| 济阳县| 临湘市| 汤阴县| 西吉县| 定陶县| 鸡西市| 荣成市| 新龙县| 广灵县| 西昌市| 赞皇县| 旅游| 利津县| 彝良县| 资溪县| 驻马店市| 永仁县| 沙河市| 西城区| 襄城县| 武功县| 和龙市| 东港市| 山阴县| 江口县| 乌拉特后旗| 砀山县| 石家庄市| 出国| 青海省| 启东市| 屏山县| 蒲江县| 深州市| 木兰县| 嘉黎县| 马尔康县| 新田县| 肇源县| 江门市|