1:先导入依赖

  1. <!--thumbnailator图片处理-->
  2. <dependency>
  3. <groupId>net.coobird</groupId>
  4. <artifactId>thumbnailator</artifactId>
  5. <version>0.4.8</version>
  6. </dependency>

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

  1. import net.coobird.thumbnailator.Thumbnails;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.ByteArrayOutputStream;
  6.  
  7. /**
  8. * @PROJECT_NAME: water_chivalry
  9. * @AUTHOR: Hanson-Hsc
  10. * @DATE: 2020-07-27 09:08
  11. * @DESCRIPTION: 图片压缩工具
  12. * @VERSION:
  13. */
  14. public class PicUtils {

  15.   //以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值
  16. private static final Logger logger = LoggerFactory.getLogger(PicUtils.class);
  17. private static final Integer ZERO = 0;
  18. private static final Integer ONE_ZERO_TWO_FOUR = 1024;
  19. private static final Integer NINE_ZERO_ZERO = 900;
  20. private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
  21. private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
  22. private static final Double ZERO_EIGHT_FIVE = 0.85;
  23. private static final Double ZERO_SIX = 0.6;
  24. private static final Double ZERO_FOUR_FOUR = 0.44;
  25. private static final Double ZERO_FOUR = 0.4;
  26.  
  27. /**
  28. * 根据指定大小压缩图片
  29. *
  30. * @param imageBytes 源图片字节数组
  31. * @param desFileSize 指定图片大小,单位kb
  32. * @return 压缩质量后的图片字节数组
  33. */
  34. public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
  35. if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
  36. return imageBytes;
  37. }
  38. long srcSize = imageBytes.length;
  39. double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
  40. try {
  41. while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
  42. ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
  43. ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
  44. Thumbnails.of(inputStream)
  45. .scale(accuracy)
  46. .outputQuality(accuracy)
  47. .toOutputStream(outputStream);
  48. imageBytes = outputStream.toByteArray();
  49. }
  50. logger.info("图片原大小={}kb | 压缩后大小={}kb",
  51. srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
  52. } catch (Exception e) {
  53. logger.error("【图片压缩】msg=图片压缩失败!", e);
  54. }
  55. return imageBytes;
  56. }
  57.  
  58. /**
  59. * 自动调节精度(经验数值)
  60. *
  61. * @param size 源图片大小
  62. * @return 图片压缩质量比
  63. */
  64. private static double getAccuracy(long size) {
  65. double accuracy;
  66. if (size < NINE_ZERO_ZERO) {
  67. accuracy = ZERO_EIGHT_FIVE;
  68. } else if (size < TWO_ZERO_FOUR_SEVEN) {
  69. accuracy = ZERO_SIX;
  70. } else if (size < THREE_TWO_SEVEN_FIVE) {
  71. accuracy = ZERO_FOUR_FOUR;
  72. } else {
  73. accuracy = ZERO_FOUR;
  74. }
  75. return accuracy;
  76. }
  77. }

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

  1. /**
  2. * 图片上传(招租广告图片专用入口)
  3. */
  4. @PostMapping("file/img")
  5. @ApiOperation(value = "图片上传接口(广告图片专用入口)")public ResultVo imgUploads(@RequestParam("file") MultipartFile file) throws IOException {
  6. //压缩图片到指定120K以内,不管你的图片有多少兆,都不会超过120kb,精度还算可以,不会模糊
  7. byte[] bytes = PicUtils.compressPicForScale(file.getBytes(), 120);
  8. ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
  9. //生成保存在服务器的图片名称,统一修改原后缀名为:jpg
  10. String newFileName = UUID.randomUUID() + ".jpg";
  11. OSSUtil.upload2(newFileName, inputStream);
  12. JSONObject result = new JSONObject();
  13. result.put("url", OSSUtil.getUrl2(newFileName, ""));
  14. return ResultVoUtil.success(result);
  15. }

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

  1. import com.bamboo.water_chivalry.common.enums.ResultEnum;
  2. import com.bamboo.water_chivalry.common.exception.GlobalException;
  3. import org.springframework.web.multipart.MultipartFile;
  4. import javax.imageio.ImageIO;
  5. import java.awt.*;
  6. import java.awt.image.BufferedImage;
  7. import java.io.ByteArrayInputStream;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11.  
  12. /**
  13. * @PROJECT_NAME: water_chivalry
  14. * @AUTHOR: Hanson-Hsc
  15. * @DATE: 2020-07-20 09:24
  16. * @DESCRIPTION: 图片压缩工具
  17. * @VERSION:
  18. */
  19. public class ImgCompression {
  20.  
  21. public static InputStream getImageCom(MultipartFile file) throws IOException {
  22. //获取文件输入流
  23. InputStream inputStream = file.getInputStream();
  24. try {
  25. // 把图片读入到内存中
  26. BufferedImage bufImg = ImageIO.read(inputStream);
  27. // 压缩代码,存储图片文件byte数组
  28. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  29. //防止图片变红,这一步非常重要
  30. BufferedImage bufferedImage = new BufferedImage(bufImg.getWidth(), bufImg.getHeight(), BufferedImage.TYPE_INT_RGB);
  31. bufferedImage.createGraphics().drawImage(bufImg,0,0, Color.WHITE,null);
  32. //先转成jpg格式来压缩,然后在通过OSS来修改成源文件本来的后缀格式
  33. ImageIO.write(bufferedImage,"jpg",bos);
  34. //获取输出流
  35. inputStream = new ByteArrayInputStream(bos.toByteArray());
  36. return inputStream;
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. throw new GlobalException(ResultEnum.IMG_UPLOAD_ERROR);
  40. }finally {
  41. inputStream.close();
  42. }
  43. }
  44. }

java图片压缩工具类(指定压缩大小)的更多相关文章

  1. 压缩图片工具类,压缩100KB以内拿走直接用

    最近遇到自拍上传图片过大问题,很烦恼,所以自己写了一个压缩图片的工具类使用,自测效果很不错,可以压缩到KB以内,像素还可以分辨清晰 下面Java代码奉上: import lombok.extern.s ...

  2. Java图片工具类,完成图片的截取和任意缩放

    package com.common.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Renderin ...

  3. Java常用工具类之压缩解压

    package com.wazn.learn.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream ...

  4. Java 图片压缩

    package com.wuyu.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.Buff ...

  5. Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

    前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...

  6. java图片压缩(Thumbnails)

    package com.hzxc.groupactivity.server.util; import java.awt.image.BufferedImage; import java.io.*; i ...

  7. Java 图片矢量压缩

    直接贴出工具类源码 package com.snow.web.util.publics; import java.awt.Image; import java.awt.image.BufferedIm ...

  8. 最近工作用到压缩,写一个zip压缩工具类

    package test; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream ...

  9. 压缩工具类 - ZipUtils.java

    压缩工具类,提供压缩文件.解压文件的方法. 源码如下:(点击下载 - ZipUtils.java .FolderUtils.java.ant-1.7.0.jar.commons-io-2.4.jar. ...

随机推荐

  1. Java 从入门到进阶之路(二十九)

    在之前的文章我们已经可以对本地对文件和目录进行新建和删除等操作,接下来我们来对文件内对具体内容进行操作. 如下代码,我们实现了一个基本的文件写入: /** * java.io.RandomAccess ...

  2. web前端开发书籍推荐_css/css3的好书有哪些?

    css/css3样式已是web前端开发的主流技术了.每个优秀的前端程序员都应该熟悉,甚至精通css.那么要如何才能学好css,并很好的应用到实际开发中,这篇文章就推荐一些关于css相关的书籍给大家. ...

  3. 在html中如何兼容使用WebP格式的图片【图片升级到WebP】

    把已有的图片转换为WebP格式 要使用WebP格式,需要将你网站用到的图片都制作一份WebP格式的版本,如果你使用CDN服务商,它们一般都会提供转码到WebP格式的选项.如又拍云: 增加这样的配置后, ...

  4. 解决只能通过localhost访问Elasticsearch的问题

    解决只能通过localhost访问Elasticsearch的问题   在默认情况下Elasticsearch是无法通过外网访问的 需要绑定地址,原因如下:   具体方法为: vim /opt/es/ ...

  5. Python 之父说 Python 历史

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:鸿影洲冷 这篇文章主要内容来源于 Python 编程语言的最初设计者 ...

  6. 实现 React Hooks

    实现 React Hooks UI 开发有两个问题: 展示复用 逻辑复用 展示复用目前基本使用组件化来解决,逻辑复用一直以来都没有特别好的解决方案.React 从一开始的 mixin ,到 高阶组件 ...

  7. UVA11300 Spreading the Wealth 题解

    题目 A Communist regime is trying to redistribute wealth in a village. They have have decided to sit e ...

  8. Git篇---将秘钥添加到github

    第1步:创建SSH Key.在用户主目录下,看看有没有-/.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开She ...

  9. java 面向对象(十七):单元测试方法

    * Java中的JUnit单元测试 * * 步骤: * 1.中当前工程 - 右键择:build path - add libraries - JUnit 4 - 下一步 * 2.创建Java类,进行单 ...

  10. 从零开始学Electron笔记(五)

    在之前的文章我们介绍了一下Electron的右键菜单的制作,接下来我们继续说一下Electron如何通过链接打开浏览器和嵌入网页. 现在有这样一个需求,我们要在我们的软件中加一个链接,然后点击该链接打 ...