当前位置: 代码网 > it编程>编程语言>Java > SpringBoot压缩png, jpg, jpeg, webp类型图片的实现代码

SpringBoot压缩png, jpg, jpeg, webp类型图片的实现代码

2024年08月26日 Java 我要评论
1.需求业务要求对png, jpg, jpeg, webp 格式图片进行等比例压缩2.开发中遇到的问题使用 thumbnails 包, 发现只能压缩 jpg 和 jpeg , 不能压缩webp接着找到

1.需求

业务要求对png, jpg, jpeg, webp 格式图片进行等比例压缩

2.开发中遇到的问题

使用 thumbnails 包, 发现只能压缩 jpg 和 jpeg , 不能压缩webp
接着找到了 webp-imageio 解决webp , 又发现 这俩都不支持 png ,
接着找到了 openviewerfx 去处理png…

3. 实现代码

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 代码

我这里自己定死了生产图片文件夹的路径 , 各位大神按照自己实际的需求改动

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转为 float
        float qualityfloat = float.parsefloat(quality);

        imagecompressionservice.compressimagebysize(inputfile, outputfile,qualityfloat);

        inputfile.delete();

        return "file compressed successfully by size: " + outputfile.getabsolutepath();
    }

    /**
     * 判断文件夹是否存在, 如果没有则创建
     * @param outputfile
     */
    private void prepareoutputdirectory(file outputfile) {
        if (!outputfile.getparentfile().exists()) {
            outputfile.getparentfile().mkdirs();
        }
    }

    /**
     * 将multipartfile转换为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; // 默认压缩质量为 80

    /**
     * 压缩图片方法
     * @param inputfile
     * @param outputfile
     * @param quality
     * @throws ioexception
     */
    public void compressimagebysize(file inputfile, file outputfile, float quality) throws ioexception {

        // 根据输入文件的后缀名获取文件格式
        string formatname = getfileextension(inputfile);

        // 根据不同的文件格式,调用相应的压缩方法
        if ("webp".equalsignorecase(formatname)) {
            // 对webp格式的图片进行压缩
            compresswebpimage(inputfile,outputfile,quality);
        } else if("png".equalsignorecase(formatname)){
            // 对png格式的图片进行压缩
            compresspngimage(inputfile, outputfile);
        } else {
            // 对jpg或其他格式的图片进行压缩,这里假设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) // 设置输出图片的质量
                .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();

        // 设置输出流
        try (imageoutputstream ios = imageio.createimageoutputstream(outputfile)) {
            writer.setoutput(ios);

            // 设置压缩参数
            webpwriteparam writeparam = (webpwriteparam) writer.getdefaultwriteparam();
            writeparam.setcompressionmode(imagewriteparam.mode_explicit);
            writeparam.setcompressiontype("lossy");
            writeparam.setcompressionquality(quality); // 设置压缩质量,值范围 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 调用

在这里插入图片描述

3.5 效果图

3.5.1 压缩前:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.5.2 压缩后

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

以上就是springboot压缩png, jpg, jpeg, webp类型图片的实现代码的详细内容,更多关于springboot压缩图片的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com