欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

  • Spring Cloud Gateway組件的三種使用方式實(shí)例詳解

    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-01
  • Java泛型的簡單實(shí)例

    Java泛型的簡單實(shí)例

    這篇文章介紹了Java泛型的簡單實(shí)例,有需要的朋友可以參考一下
    2013-10-10
  • MyBatis-Plus輸出完整SQL(帶參數(shù))的三種方案

    MyBatis-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使用I/O流讀取文件內(nèi)容的方法詳解

    Java使用I/O流讀取文件內(nèi)容的方法詳解

    這篇文章主要介紹了Java使用I/O流讀取文件內(nèi)容的方法,結(jié)合實(shí)例形式詳細(xì)分析了java使用I/O流讀取文件常見操作技巧,需要的朋友可以參考下
    2019-11-11
  • 淺談java實(shí)現(xiàn)背包算法(0-1背包問題)

    淺談java實(shí)現(xiàn)背包算法(0-1背包問題)

    本篇文章主要介紹了淺談java實(shí)現(xiàn)背包算法(0-1背包問題) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot實(shí)現(xiàn)登錄攔截器的方法詳解

    SpringBoot實(shí)現(xiàn)登錄攔截器的方法詳解

    其實(shí)spring?boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器功能,需要的朋友可以參考下
    2022-07-07
  • 淺談java泛型的作用及其基本概念

    淺談java泛型的作用及其基本概念

    下面小編就為大家?guī)硪黄獪\談java泛型的作用及其基本概念。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • SpringBoot自動(dòng)裝配之@Import深入講解

    SpringBoot自動(dòng)裝配之@Import深入講解

    由于最近的項(xiàng)目需求,需要在把配置類導(dǎo)入到容器中,通過查詢,使用@Import注解就能實(shí)現(xiàn)這個(gè)功能,@Import注解能夠幫我們吧普通配置類(定義為Bean的類)導(dǎo)入到IOC容器中
    2023-01-01
  • SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別

    SpringBoot中@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)換、輸入、命名問題

    這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論