java使用hutool工具类实现base64字符串image的压缩

需求:
图片传给第三方,但是有宽带限制大于40KB的图片都需要做处理,进行压缩
实现方式:

通过HuTool工具包下的ImgUtil工具类来实现
Hutool工具类API地址:Hutool工具类API地址
ImgUtil工具地址:ImgUtil工具地址

工具类说明:
//提供两种重载方法:其中一个是按照长宽缩放,另一种是按照比例缩放。

ImgUtil.scale(
    FileUtil.file("d:/face.jpg"), 
    FileUtil.file("d:/face_result.jpg"), 
    0.5f//缩放比例
);
实现步骤:

1,引入maven坐标

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.4</version>
</dependency>

2,工具类:
工具类包含了一个根据base64数据计算图片大小的方法,具体从哪里抄来的找不见了,回头看到附上链接- -

import cn.hutool.core.img.ImgUtil;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;


/**
 * Created in 2021/7/14 10:23
 * 图片相关工具类
 * @author 
 */
public class ImageUtil {
    /**
     * 计算图片的大小,返回单位为KB
     * @param imageBase64Str 图片base64数据
     * @return 图片大小
     */
    public static Integer imageSize(String imageBase64Str){

        //1.找到等号,把等号也去掉(=用来填充base64字符串长度用)
        Integer equalIndex= imageBase64Str.indexOf("=");
        if(imageBase64Str.indexOf("=")>0) {
            imageBase64Str=imageBase64Str.substring(0, equalIndex);
        }
        //2.原来的字符流大小,单位为字节
        Integer strLength=imageBase64Str.length();
        System.out.println("imageBase64Str Length = "+strLength);
        //3.计算后得到的文件流大小,单位为字节
        Integer size=strLength-(strLength/8)*2;
        return bytesToKB(size);
    }

    /**
     * byte(字节)根据长度转成kb(千字节)
     * @param bytes
     * @return
     */
    public static  Integer bytesToKB(long bytes) {
        BigDecimal filesize = new BigDecimal(bytes);
        BigDecimal megabyte = new BigDecimal(1024 * 1024);
        BigDecimal kilobyte = new BigDecimal(1024);
        float returnValue = filesize.divide(kilobyte, 1, BigDecimal.ROUND_DOWN).floatValue();
        return (int)returnValue ;
    }

    /**
     * 根据图片的base64数据缩放图片
     * @param base64ImagStr 原图的base64字符换
     * @param imageType 图片类型
     * @return
     */
    public static String scaleImage(String base64ImagStr,String imageType){
        BufferedImage bufferedImage = ImgUtil.toImage(base64ImagStr);
   		// 这块也可以直接通过传入一个image对象,
        Image scaleImage = ImgUtil.scale(bufferedImage, 0.2f);
        String resultBase64Str = ImgUtil.toBase64(scaleImage, imageType);

        Integer imageSizeBase64 = imageSize(resultBase64Str);
        if(imageSizeBase64 > 40){
            scaleImage(resultBase64Str,imageType);
        }
        return resultBase64Str;

    }
}

准确的说,缩放图片的代码只有如下几行:

BufferedImage bufferedImage = ImgUtil.toImage(base64ImagStr);
Image scaleImage = ImgUtil.scale(bufferedImage, 0.2f);
String resultBase64Str = ImgUtil.toBase64(scaleImage, imageType);
部分方法说明:

官方的API中提供的scale方法是需要一个Image对象和缩放比例,可以通过FiltUtil直接传入绝对路径获取到(最上面的官方API有说明),但是base64的话,需要通过其他方式来处理
在这里插入图片描述
ImgUtil下提供了toImage这个方法,返回的是一个Image接口的实现子类对象,因此可以用它来转一个base64的图片为一个Image对象
在这里插入图片描述
缩放完成之后,会返回一个Image实现子类对象,同样可以通过ImgUtil下的toBase64来返回对应的base64数据
在这里插入图片描述

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值