将图片压缩至指定大小Kb(Thumbnailator)
放代码前,先唠叨唠叨,舒缓一下我的郁闷之情。
今天下午改一个后台管理系统的需求,要求上传的图片要压缩到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)相关推荐
- 图片不超过200kb怎么调整?一分钟学会图片压缩到指定大小
很多网站为了保证页面的流畅度会限制图片上传的kb大小,所以我们需要把图片压缩到指定大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图),那么有没有比较快捷的方法可以自定义压缩图片大小呢?今天 ...
- 如何将图片压缩到指定大小?压缩图片大小的方法
很多报名平台都对图片大小有固定的数值要求,所以不少小伙伴来问,怎么压缩图片200k以下(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)?想要把图片压缩指定大小就要用到一些比较专业的工具,今天 ...
- 怎么把图片压缩到30k以内?如何图片压缩到指定大小?
在公务员考试报名时,需要提交个人证件照片,通常都会要求照片大小不能超过30kb,否则会导致上传失败.那么怎么把图片压缩到30k以内呢?想要把图片压缩到30kb就需要用到压缩图的图片压缩指定大小(图片压 ...
- JS将base64图片压缩至指定大小
base64图片压缩至指定大小 在开发中,通常在上传图片时,由于各种限制,需要将上传的图片压缩到某一大小范围内才能上传.在此提供以下方法实现该需求,复制可用. /*** 压缩图片到指定大小* @par ...
- 图片如何缩小到100k?怎么把图片压缩到指定大小?
有时候在平台上传图片会规定大小100k,图片如何缩小到100k呢?可以使用压缩图的图片压缩到指定大小功能,十分的方便一键操作就可以将图片压缩到100k以内,来看看具体操作步骤吧. 1.打开压缩图点击图 ...
- 图片大小如何调整到10k?图片压缩到指定大小怎么弄?
在现代社交网络和在线平台上,上传的图片大小都会有限制,过大的图像会导致性能问题.加载时间延长和带宽消耗,所以图片压缩指定大小(https://www.yasuotu.com/imagesize)就成了 ...
- iOS图片压缩成指定大小
在iOS中涉及一些图片显示和处理问题,在实际中碰到过修改账户头像时上传头像出现 error = Error Domain=com.alamofire.error.serialization.respo ...
- 图片怎么压缩到200k以内?图片压缩怎么指定大小?
在某些情况下,我们需要将图片压缩到指定(https://www.yasuotu.com/imagesize)的大小,例如200k以内,在本文中,我们将用一个特别简单的方法来将图片压缩到200k以内的 ...
- C# 图片压缩(指定大小压缩和指定尺寸压缩)
一按大小压缩测试代码: 一测试效果: 一主要代码: /// <summary>/// 压缩图片至200 Kb以下/// </summary>/// <param name ...
最新文章
- [数据结构复习]树_二叉树
- Spring 注解 @Resource和@Autowired(转)
- 游戏框架View以及简单的运用
- 绘制隐藏层的激活值的分布[直方图]
- ubuntu 14.04 配置 java 环境
- 一文读懂ClickHouse(概述,安装,数据类型,表引擎,sql语法)
- 知识图谱中的关系推理
- 小米路由器安装MT工具箱(图文教程)
- 【交换机在江湖】实战案例二十九 MSTP配置示例
- csf播放器(csf播放器ios)
- win10命令行压缩/解压缩文件
- JDK8各个历史版本下载方法
- gp数据库与pg数据库
- Vue学习(学习打卡Day12)
- React中文文档之Composition vs Inheritance
- 单页面SPA和多页面MPA应用的区别
- 台湾、香港、澳门的城市三级联动json
- 转型科技狂的安踏 要用“赢领计划”抄底NIKE?
- FFmpeg和RTMP结合编译
- 知识付费这么红,它会成为KFC吗?
热门文章
- SCA可达性分析基础知识普及
- 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨
- vs2017打开项目后项目是空的
- 第三方支付结算周期T1,T0,D1,D0区别
- 动物判别系统python实现
- (转)iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
- easyUI可编辑表格编辑器添加事件
- MAC使用Bootcamp安装win7
- 区块链治理框架总结,从Telos实践说起
- matlab fmu,在Simulink中初始化Dymola FMU