1:先导入依赖

<!--thumbnailator图片处理--><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>

2:创建工具类--->PicUtils

import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;/*** @PROJECT_NAME: fdfs* @AUTHOR: zhang* @DATE: 2022-01-13 10:01* @DESCRIPTION: 图片压缩工具* @VERSION:*/
public class PicUtils {//以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值private static final Logger logger = LoggerFactory.getLogger(PicUtils.class);private static final Integer ZERO = 0;private static final Integer ONE_ZERO_TWO_FOUR = 1024;private static final Integer NINE_ZERO_ZERO = 900;private static final Integer THREE_TWO_SEVEN_FIVE = 3275;private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;private static final Double ZERO_EIGHT_FIVE = 0.85;private static final Double ZERO_SIX = 0.6;private static final Double ZERO_FOUR_FOUR = 0.44;private static final Double ZERO_FOUR = 0.4;/*** 根据指定大小压缩图片** @param imageBytes  源图片字节数组* @param desFileSize 指定图片大小,单位kb* @return 压缩质量后的图片字节数组*/public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {return imageBytes;}long srcSize = imageBytes.length;double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);try {while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);Thumbnails.of(inputStream).scale(accuracy).outputQuality(accuracy).toOutputStream(outputStream);imageBytes = outputStream.toByteArray();}logger.info("图片原大小={}kb | 压缩后大小={}kb",srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);} catch (Exception e) {logger.error("【图片压缩】msg=图片压缩失败!", e);}return imageBytes;}/*** 自动调节精度(经验数值)** @param size 源图片大小* @return 图片压缩质量比*/private static double getAccuracy(long size) {double accuracy;if (size < NINE_ZERO_ZERO) {accuracy = ZERO_EIGHT_FIVE;} else if (size < TWO_ZERO_FOUR_SEVEN) {accuracy = ZERO_SIX;} else if (size < THREE_TWO_SEVEN_FIVE) {accuracy = ZERO_FOUR_FOUR;} else {accuracy = ZERO_FOUR;}return accuracy;}
}

3:在上传图片接口处进行压缩

    /*** 图片上传*/@PostMapping("file/img")@ApiOperation(value = "图片上传接口")public Result imgUploads(@RequestParam("file") MultipartFile file) throws IOException {//压缩图片到指定120K以内,不管你的图片有多少兆,都不会超过120kb,精度还算可以,不会模糊byte[] bytes = PicUtils.compressPicForScale(file.getBytes(), 120);ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);//生成保存在服务器的图片名称,统一修改原后缀名为:jpgString newFileName = UUID.randomUUID() + ".jpg";OSSUtil.upload2(newFileName, inputStream);JSONObject result = new JSONObject();result.put("url", OSSUtil.getUrl2(newFileName, ""));return Result.success(result);}

还有一个压缩图片工具类,但是不能指定压缩大小,可是很有用,压缩不会丢失精度,图片也很清晰:

import com.bamboo.water_chivalry.common.enums.ResultEnum;
import com.bamboo.water_chivalry.common.exception.GlobalException;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** @PROJECT_NAME: fdfs* @AUTHOR: zhang* @DATE: 2022-01-13 10:33* @DESCRIPTION: 图片压缩工具* @VERSION:*/
public class ImgCompression {public static InputStream getImageCom(MultipartFile file) throws IOException {//获取文件输入流InputStream inputStream = file.getInputStream();try {// 把图片读入到内存中BufferedImage bufImg = ImageIO.read(inputStream);// 压缩代码,存储图片文件byte数组ByteArrayOutputStream bos = new ByteArrayOutputStream();//防止图片变红,这一步非常重要BufferedImage bufferedImage = new BufferedImage(bufImg.getWidth(), bufImg.getHeight(), BufferedImage.TYPE_INT_RGB);bufferedImage.createGraphics().drawImage(bufImg,0,0, Color.WHITE,null);//先转成jpg格式来压缩,然后在通过OSS来修改成源文件本来的后缀格式ImageIO.write(bufferedImage,"jpg",bos);//获取输出流inputStream = new ByteArrayInputStream(bos.toByteArray());return inputStream;} catch (IOException e) {e.printStackTrace();throw new GlobalException(ResultEnum.IMG_UPLOAD_ERROR);}finally {inputStream.close();}}
}

java图片压缩工具类(指定压缩大小)相关推荐

  1. Java图片压缩工具类(递归压缩到指定大小范围)

    Java图片压缩工具 工具类使用场景 公司做人脸识别项目时候需要上传学生.家长.教师.访客的正面照图片,但是人脸识别机器有限制只接收200KB-1M的图片,所以必须做图片压缩到指定范围大少. APP上 ...

  2. java图片压缩工具类

    java图片压缩工具类 PicCompressUtil.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutput ...

  3. java 图片旋转_Java实现图片旋转、指定图像大小和水平翻转|chu

    本文实例为大家分享了Java实现图片旋转.指定图像大小.水平翻转,供大家参考,具体内容如下 package com.zeph.j2se.image; import java.awt.Graphics2 ...

  4. android图片压缩工具类

    好久没写博客了,一方面是因为最近找了家实习单位,很累基本上下班后就没有打不起精神去学习,另一方面我自己觉得写博客确实有点耗时间,趁着周六周日想花点时间研究下fresco,picass,Glide等框架 ...

  5. 一个好用的android图片压缩工具类

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  6. JAVA图片裁剪工具类

    JAVA图片裁剪工具类: <span style="font-size:14px;">package org.oms.avatar.util;import java.a ...

  7. 整合的图片压缩工具类ImageTools

    根据网上找的资料和自己用到的地方进行修改的图片压缩工具类,有什么不对的地方请见谅,源码如下: public final class ImageTools {/*** Transfer drawable ...

  8. java图片的导出,并压缩

    java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...

  9. java zip 压缩工具类

    java zip 压缩工具类 目录结构 环境依赖 zip压缩工具类 遇到的问题 环境依赖 <!--这里作者使用的是 springboot 2.3.2.RELEASE 版本--> <d ...

最新文章

  1. Squash my last X commits together using Git | Git 如何合并历史提交记录?
  2. tampermonkey怎么不能用了_普洱茶发霉了怎么办?能不能用太阳晒
  3. CruiseControl.NET与TFS结合的配置文件
  4. winform防止sqlserver注入_c# 防止sql注入对拼接sql脚本的各个参数处理
  5. JAVA-date(计算时间差)
  6. 浮动元素横排居中显示及浏览器兼容性处理
  7. 【亲自动手试验过的】硬盘免光驱安装Fedora5
  8. 《英语(二)》作文案例
  9. 硬盘数据恢复原理与方法(一)
  10. postman批量调用接口操作步骤
  11. java lstm pb_在Tensorflow Serving上部署基于LSTM的文本分类模型
  12. 火狐Firefox地址栏搜索引擎修改方法!
  13. 刷题学习—算法思想(双指针、排序、回溯、二分法、滑动窗口、贪心、单调栈)
  14. iOS开发xcode报错:xxxxxxhas been modified since the precompiled header was built
  15. DCMM认证评估机构,你都知道吗?
  16. 基于C2C的商务管理系统 JSP+MYSQL C2C购物商城SSH
  17. 五十四、SAP中LVC表格每列的宽度自适应
  18. 【Python】_1.Python基础语法
  19. PMP新考纲 敏捷题目 (三)
  20. matlab for矩阵,(matlab)使用for循环产生以下矩阵:

热门文章

  1. VLOOKUP返回N/A的一种原因
  2. java schtasks 不生效,自动化测试之Windows计划定时任务命令schtasks及语法
  3. 中年齐家网的焦虑和隐忧
  4. Win7 安装Python3.7.7(小白自学)
  5. coco数据集大小分类_COCO 数据集使用说明书
  6. python怎么封装函数_python怎么封装函数
  7. 怎么把caj完整转换成Word文档?
  8. 码农逆行被拦,跪下痛哭!
  9. Android Studio下载地址
  10. 计算机体系结构学习零碎记录