IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Java - 图片压缩(返回压缩后图片的base64字符串) -> 正文阅读

[开发测试]Java - 图片压缩(返回压缩后图片的base64字符串)

前言:

  • 压缩时间较长, 5M左右的图片压缩至500k左右大概需要2秒左右;
  • Demo中返回base64字符串, 可根据自己需求改返回值类型;

环境:

  • JDK 1.8
  • IDEA 2021.3

注意:

  • 本人只测试了两种类型的图片(jpg/png),其他类型还需自行测试;
  • png类型的图片有点特殊,只能用另个开源组件进行压缩;

具体请看代码:

<!-- 处理除png以外的图片 -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

<!-- 处理png类型的图片 -->
<dependency>
    <groupId>org.jpedal</groupId>
    <artifactId>OpenViewerFX</artifactId>
    <version>6.6.14</version>
</dependency>

import com.idrsolutions.image.png.PngCompressor;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;

import java.io.*;
import java.util.Base64;
import java.util.Optional;

/**
 * 图片工具类
 */
@Slf4j
public class ImageUtil {

    /**
     *  压缩图片,返回base64字符串
     *  接收MultipartFile格式文件;
     * @param multipartFile
     * @return
     * @throws Exception
     */
    public static String compressImageByMultipartFile(MultipartFile multipartFile) throws Exception {
        File sourceFile = MultipartFileToFile(multipartFile);
        return compressImageByFile(sourceFile);
    }

    /**
     * 将MultipartFile转换为File
     */
    public static File MultipartFileToFile(MultipartFile multiFile) throws IOException {
        String fileName = multiFile.getOriginalFilename();
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        InputStream in = null;
        OutputStream out = null;
        try {
            File file = File.createTempFile(fileName, prefix);
            out = new FileOutputStream(file);
            in = multiFile.getInputStream();
            int read = 0;
            byte[] buffer = new byte[1024];
            while ((read = in.read(buffer, 0, 1024)) != -1) {
                out.write(buffer, 0, read);
            }
            return file;
        } catch (Exception e) {
            throw e;
        }finally {
            if (in != null){
                in.close();
            }
            if (out != null){
                out.close();
            }
        }
    }

    /**
     * 压缩jpg图片,返回base64字符串
     * sourceFile: 源文件;
     */
    public static String compressImageByFile(File sourceFile) throws Exception {
        log.info("原文件大小:[{}]",sourceFile.length());
        InputStream in = null;
        ByteArrayOutputStream out = null;
        try {
            //大于500K进行压缩:
            if (sourceFile.length() > 500 * 1024) {
                String fileName = sourceFile.getName();
                String prefix = fileName.substring(fileName.lastIndexOf(".")+1);
                if ("png".equals(prefix.toLowerCase())){
                    PngCompressor.compress(sourceFile,sourceFile);
                }else {
                    //sourceFile = getCompressFile(sourceFile,0.15f);
                    Thumbnails.of(sourceFile).scale(1f).outputQuality(0.1f).toFile(sourceFile);
                }
                log.info("文件格式:[{}] -- 压缩后文件大小:[{}]",prefix,sourceFile.length());
            }

            in = new FileInputStream(sourceFile);
            out = new ByteArrayOutputStream();
            int read = 0;
            byte[] buffer = new byte[1024];
            while ((read = in.read(buffer, 0, 1024)) != -1) {
                out.write(buffer, 0, read);
            }
            return Base64.getEncoder().encodeToString(out.toByteArray());
        } catch (IOException e) {
            throw e;
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null){
                out.close();
            }
        }
    }

    /**
     * 如果接口超时时间允许,也可以递归处理压缩,以至于达到最理想的压缩大小;
     * @param file
     * @param quality
     * @return
     * @throws IOException
     */
    private static File getCompressFile(File file,float quality) throws IOException {
        Thumbnails.of(file).scale(1f).outputQuality(quality).toFile(file);
        if(quality <= 0.1f || file.length() <= 500 * 1024){
            return file;
        }else{
            quality = quality - 0.05f;
            return getCompressFile(file,quality);
        }
    }
}

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;

@RestController
public class ImageDemoController {

    /** main方法测试 */
    public static void main(String[] args) {
        try {
            File file = new File("C:/原图片.jpg");
            String s = ImageUtil.compressImageByFile(file);
            System.out.println("压缩后图片的base64字符串::" + s);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /** 项目中测试 */
    @PostMapping("/test/compressImage")
    public  String compressImage(MultipartFile file){
        try {
            String s = ImageUtil.compressImageByMultipartFile(file);
            System.out.println("压缩后图片的base64字符串::" + s);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "成功";
    }

}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:25:31  更:2022-05-08 08:25:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 14:06:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码