放代码前,先唠叨唠叨,舒缓一下我的郁闷之情。

今天下午改一个后台管理系统的需求,要求上传的图片要压缩到300kb,感觉不难,就开搞。

先撩拨一下度娘,搞点货出来瞅瞅,不复杂就干脆搬砖算了。

嗯,度娘不愧为度娘,货不少,找到一个简单(优秀)的一匹的博文,用的是一个优秀的google开源的图片处理的java类库Thumbnailator(想了解么,有大神总结了[Thumbnailator使用简介],和前面那篇差不多,呵呵)。

不过呢,他们只是介绍了这个优秀的类库的使用,而我需要指定将图片压缩到多大,所以说呢,度娘真美,要啥给啥[使用Thumbnails实现图片指定大小压缩],美滋滋,开始搬砖,搬完还要搞其他的事呢。

燃,冰卵,由于开发框架用的是闲大赋团队开发的SpringBoot-Plus的后台管理系统,他的图片上传后,会在图片名称后加上UUID,这就导致了,使用Thumbnailator中的方法输出文件时,会报net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.-找不到合适的图片阅读器的异常,因为后缀不在是图片的后缀了,而是一串UUID。无奈的我,只能想办法解决咯。

幸运的是,有大佬[java图片压缩(Thumbnails)]在,我站上了巨人的肩膀,哈哈哈

好了,不逼逼了,放上代码,记录一下:

SpringBoot-Plus的图片上传方法,略作修改:
/*附件类操作*/
@PostMapping(MODEL + "/uploadAttachment.json")
@ResponseBody
public JsonResult uploadFile(@RequestParam("file") MultipartFile file,String batchFileUUID,String bizType,String bizId) throws IOException {if(file.isEmpty()) {return JsonResult.fail();}System.out.println(batchFileUUID + "========= type =========   "  + bizType + "   "  + bizId  );CoreUser user = platformService.getCurrentUser();CoreOrg  org = platformService.getCurrentOrg();FileItem fileItem = fileService.createFileItem(file.getOriginalFilename(), bizType, bizId, user.getId(), org.getId(), batchFileUUID,null);saveAttachment(file,batchFileUUID,bizId,user,fileItem);OutputStream os = fileItem.openOutpuStream();// 添加判断,上传的文件是否是图片if("jpg|png|gif|bmp|jpeg".contains(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1))){// 使用压缩方法byte[] bytes = FileUtil.commpressPicCycle(file.getBytes(), 300, 0.5f);os.write(bytes);os.close();}else {FileUtil.copy(file.getInputStream(), os);}return JsonResult.success(fileItem);
}
压缩方法:
/**** @param bytes 原图片字节数组* @param desFileSize 指定图片大小,单位 kb* @param accuracy 精度,递归压缩的比率,建议小于0.9* @return*/public static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException{// 获取目标图片
//        File imgFile = new File(desPath);
//        long fileSize = imgFile.length();long fileSize = bytes.length;System.out.println("=====fileSize======== "+fileSize);// 判断图片大小是否小于指定图片大小if(fileSize <= desFileSize * 1024){return bytes;}//计算宽高BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));int imgWidth = bim.getWidth();System.out.println(imgWidth+"====imgWidth=====");int imgHeight = bim.getHeight();int desWidth = new BigDecimal(imgWidth).multiply( new BigDecimal(accuracy)).intValue();System.out.println(desWidth+"====desWidth=====");int desHeight = new BigDecimal(imgHeight).multiply( new BigDecimal(accuracy)).intValue();ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);//如果不满足要求,递归直至满足要求return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);}

好了,记录完成。

将图片压缩至指定大小Kb(Thumbnailator)相关推荐

  1. 图片不超过200kb怎么调整?一分钟学会图片压缩到指定大小

    很多网站为了保证页面的流畅度会限制图片上传的kb大小,所以我们需要把图片压缩到指定大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图),那么有没有比较快捷的方法可以自定义压缩图片大小呢?今天 ...

  2. 如何将图片压缩到指定大小?压缩图片大小的方法

    很多报名平台都对图片大小有固定的数值要求,所以不少小伙伴来问,怎么压缩图片200k以下(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)?想要把图片压缩指定大小就要用到一些比较专业的工具,今天 ...

  3. 怎么把图片压缩到30k以内?如何图片压缩到指定大小?

    在公务员考试报名时,需要提交个人证件照片,通常都会要求照片大小不能超过30kb,否则会导致上传失败.那么怎么把图片压缩到30k以内呢?想要把图片压缩到30kb就需要用到压缩图的图片压缩指定大小(图片压 ...

  4. JS将base64图片压缩至指定大小

    base64图片压缩至指定大小 在开发中,通常在上传图片时,由于各种限制,需要将上传的图片压缩到某一大小范围内才能上传.在此提供以下方法实现该需求,复制可用. /*** 压缩图片到指定大小* @par ...

  5. 图片如何缩小到100k?怎么把图片压缩到指定大小?

    有时候在平台上传图片会规定大小100k,图片如何缩小到100k呢?可以使用压缩图的图片压缩到指定大小功能,十分的方便一键操作就可以将图片压缩到100k以内,来看看具体操作步骤吧. 1.打开压缩图点击图 ...

  6. 图片大小如何调整到10k?图片压缩到指定大小怎么弄?

    在现代社交网络和在线平台上,上传的图片大小都会有限制,过大的图像会导致性能问题.加载时间延长和带宽消耗,所以图片压缩指定大小(https://www.yasuotu.com/imagesize)就成了 ...

  7. iOS图片压缩成指定大小

    在iOS中涉及一些图片显示和处理问题,在实际中碰到过修改账户头像时上传头像出现 error = Error Domain=com.alamofire.error.serialization.respo ...

  8. 图片怎么压缩到200k以内?图片压缩怎么指定大小?

    ​在某些情况下,我们需要将图片压缩到指定(https://www.yasuotu.com/imagesize)的大小,例如200k以内,在本文中,我们将用一个特别简单的方法来将图片压缩到200k以内的 ...

  9. C# 图片压缩(指定大小压缩和指定尺寸压缩)

    一按大小压缩测试代码: 一测试效果: 一主要代码: /// <summary>/// 压缩图片至200 Kb以下/// </summary>/// <param name ...

最新文章

  1. [数据结构复习]树_二叉树
  2. Spring 注解 @Resource和@Autowired(转)
  3. 游戏框架View以及简单的运用
  4. 绘制隐藏层的激活值的分布[直方图]
  5. ubuntu 14.04 配置 java 环境
  6. 一文读懂ClickHouse(概述,安装,数据类型,表引擎,sql语法)
  7. 知识图谱中的关系推理
  8. 小米路由器安装MT工具箱(图文教程)
  9. 【交换机在江湖】实战案例二十九 MSTP配置示例
  10. csf播放器(csf播放器ios)
  11. win10命令行压缩/解压缩文件
  12. JDK8各个历史版本下载方法
  13. gp数据库与pg数据库
  14. Vue学习(学习打卡Day12)
  15. React中文文档之Composition vs Inheritance
  16. 单页面SPA和多页面MPA应用的区别
  17. 台湾、香港、澳门的城市三级联动json
  18. 转型科技狂的安踏 要用“赢领计划”抄底NIKE?
  19. FFmpeg和RTMP结合编译
  20. 知识付费这么红,它会成为KFC吗?

热门文章

  1. SCA可达性分析基础知识普及
  2. 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨
  3. vs2017打开项目后项目是空的
  4. 第三方支付结算周期T1,T0,D1,D0区别
  5. 动物判别系统python实现
  6. (转)iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
  7. easyUI可编辑表格编辑器添加事件
  8. MAC使用Bootcamp安装win7
  9. 区块链治理框架总结,从Telos实践说起
  10. matlab fmu,在Simulink中初始化Dymola FMU