栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java - 图片压缩(返回压缩后图片的base64字符串)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java - 图片压缩(返回压缩后图片的base64字符串)

前言:

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

环境:

  • JDK 1.8
  • IDEA 2021.3

注意:

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


    net.coobird
    thumbnailator
    0.4.8




    org.jpedal
    OpenViewerFX
    6.6.14
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 {

    
    public static String compressImageByMultipartFile(MultipartFile multipartFile) throws Exception {
        File sourceFile = MultipartFileToFile(multipartFile);
        return compressImageByFile(sourceFile);
    }

    
    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();
            }
        }
    }

    
    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();
            }
        }
    }

    
    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 {

    
    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 "成功";
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号