java生成图片缩略图
目录
- 前言
- 一、使用Base64编码方式
- 1、基本方法
- 2、压缩本地图片保存到本地
- 3、压缩网络图片到图片服务器
- 二、使用thumbnailator工具方式
- 1、导入依赖
- 2、压缩本地图片保存到本地
前言
下面介绍了两种获取图片缩略图的方式,全都不是一次性压缩,如果没有达到设置的压缩范围,图片会循环压缩,大家根据自己的需求,可以自己调节最大缩略图的大小范围。
经过测试第二种方式效率更高,但是对于压缩率只是初步设置一个大致范围,还需要更精细化的调试
一、使用Base64编码方式
此方式全都需要使用到基本方法,基本方法如下,自行复制
1、基本方法
/*** 按照宽高比例压缩** @param srcImgData 待压缩图片输入流* @param scale 压缩刻度* @return* @throws IOException* @author CY* @date 2020年11月18日*/private static byte[] compress(byte[] srcImgData, double scale) throws IOException {try {BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));int width = (int) (bi.getWidth() * scale); // 源图宽度int height = (int) (bi.getHeight() * scale); // 源图高度Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.setColor(Color.RED);g.drawImage(image, 0, 0, null); // 绘制处理后的图g.dispose();ByteArrayOutputStream bOut = new ByteArrayOutputStream();ImageIO.write(tag, "JPEG", bOut);return bOut.toByteArray();} catch (Exception e) {e.printStackTrace();}return null;}
2、压缩本地图片保存到本地
/*** 压缩本地图片保存到本地** @param path 保存文件的路径,精确到最后一个文件夹* @param localPhotoUrl 本地图片路径,精确到文件* @param fileName 新的文件名* @return*/public static String localImageCompress(String path, String localPhotoUrl, String fileName) {try {// 读取文件并转换成字节数组Path filePath = Paths.get(localPhotoUrl);byte[] picByte = Files.readAllBytes(filePath);// 对图片进行压缩byte[] finalCompressPic = compress(picByte, 0.9);BigDecimal filesize = new BigDecimal(finalCompressPic.length);BigDecimal kilobyte = new BigDecimal(1024);float returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();// 输出压缩后的图片大小System.out.println("图片的字节数:" + finalCompressPic.length + "图片的大小:" + returnValue + "KB");// 如果图片大小超过149KB,则继续压缩,直到图片大小小于或等于149KBif (returnValue > 150) {for (int i = 0; i < 9; i++) {double scale = (i + 1) * 0.1;scale = 0.9 - scale;finalCompressPic = compress(finalCompressPic, scale);filesize = new BigDecimal(finalCompressPic.length);kilobyte = new BigDecimal(1024);returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();System.out.println("继续压缩图片的字节数:" + finalCompressPic.length + "图片的大小:" + returnValue + "KB");if (returnValue > 150) {continue;} else {break;}}}// 对字节数组Base64编码Base64.Encoder encoder = Base64.getEncoder();String png_base64 = encoder.encodeToString(finalCompressPic);// 将Base64编码后的字符串转换成字节数组并保存到文件中byte[] decodedBytes = Base64.getDecoder().decode(png_base64);File outputFile = new File(path, fileName);OutputStream outputStream = new FileOutputStream(outputFile);outputStream.write(decodedBytes);// 返回生成的缩略图路径return outputFile.getAbsolutePath();} catch (IOException e) {e.printStackTrace();}return null;}
3、压缩网络图片到图片服务器
//压缩网络图片保存到图片服务器public static String netImageCompress(String photoUrl) {try {byte[] picByte = ImgBase64Util.imgToByte(photoUrl);byte[] compressPic = compress(picByte, 0.9);byte[] finalCompressPic = compressPic;BigDecimal filesize = new BigDecimal(compressPic.length);BigDecimal kilobyte = new BigDecimal(1024);float returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();//输出System.out.println("图片的字节数:" + compressPic.length + "图片的大小:" + returnValue + "KB");if (returnValue > 149) {for (int i = 0; i < 10; i++) {double scale = (i + 1) * 0.1;scale = 0.9 - scale;finalCompressPic = compress(finalCompressPic, scale);BigDecimal filesize2 = new BigDecimal(finalCompressPic.length);BigDecimal kilobyte2 = new BigDecimal(1024);float returnValue2 = filesize2.divide(kilobyte2, 2, BigDecimal.ROUND_UP).floatValue();System.out.println("循环i=" + i + "的图片的字节数:" + finalCompressPic.length + "图片的大小:" + returnValue2 + "KB");if (returnValue2 > 149) {continue;} else {break;}}}Base64.Encoder encoder = Base64.getEncoder();String png_base64 = encoder.encodeToString(finalCompressPic);File file = ImgBase64Util.base64ToFile(png_base64);FileInputStream input = new FileInputStream(file);MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", input);Map param = new HashMap();param.put("source", "system");param.put("type", "img");HttpUtils httpUtils = new HttpUtils();HttpResult httpResult = httpUtils.doFilePost("https://test.com/upload", multipartFile, param);Integer httpCode = httpResult.getCode();if (httpCode == 200) {JSONObject result = JSONObject.parseObject(httpResult.getBody());Integer code = result.getInteger("code");if (code == 0) {String url = result.getString("data");System.out.println("compress pic url:" + url);return url;}}return null;} catch (Exception e) {e.printStackTrace();return null;}}
二、使用thumbnailator工具方式
此方式需要导入依赖,依赖如下
1、导入依赖
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.19</version></dependency>
2、压缩本地图片保存到本地
/*** 压缩本地图片保存到本地** @param path 保存文件的路径,精确到最后一个文件夹* @param localPhotoUrl 本地图片路径,精确到文件* @param fileName 新的文件名* @return*/public static String localImageCompress(String path, String localPhotoUrl, String fileName) {try {File f = new File(localPhotoUrl);long sourceImgValue = f.length() / 1024;BufferedImage sourceImg = ImageIO.read(new FileInputStream(f));int width = sourceImg.getWidth();//原图宽度int height = sourceImg.getHeight();//原图高度int hightValue = width;//宽度和高度的最大值if (height > width) hightValue = height;double scale111 = 0.5;if (1000 <= hightValue && hightValue < 2000) scale111 = 0.3;if (2000 <= hightValue && hightValue < 3000) scale111 = 0.2;if (3000 <= hightValue && hightValue < 4000) scale111 = 0.1;if (4000 <= hightValue) scale111 = BigDecimal.valueOf(500L).divide(BigDecimal.valueOf(hightValue), 2, BigDecimal.ROUND_UP).doubleValue();System.out.println("最终scale为:" + scale111);/*** 图片小于5M,压缩图片最大尺寸为512K* 大于5M,小于10M,压缩图片最大尺寸为1M* 大于10M,压缩图片最大尺寸为2M*/int maxSize = 512;//压缩图片的最大尺寸if (sourceImgValue < 5 * 1024) maxSize = 512;if (5 * 1024 <= sourceImgValue && sourceImgValue < 10 * 1024) maxSize = 1024;if (10 * 1024 <= sourceImgValue) maxSize = 2 * 1024;String thumbnailPath = path + fileName;Thumbnails.of(localPhotoUrl).scale(scale111).outputQuality(0.9).toFile(thumbnailPath);File f1 = new File(thumbnailPath);long returnValue = f1.length() / 1024;System.out.println("第一次生成图片缩略图,大小为:" + returnValue + "KB");// 如果图片大小超过1M,则继续压缩,直到图片大小小于或等于149KBif (returnValue > maxSize) {for (int i = 0; i < 4; i++) {double scale = (i + 1) * 0.1;double scaleQuality = 0.9 - scale * 2;if (scale111 > scale) scale111 = scale111 - scale;System.out.println("最终scale为:" + scale111);System.out.println("最终scaleQuality为:" + scaleQuality);Thumbnails.of(localPhotoUrl).scale(scale111).outputQuality(scaleQuality).toFile(thumbnailPath);File f2 = new File(thumbnailPath);returnValue = f2.length() / 1024;System.out.println("继续压缩图片大小:" + returnValue + "KB");if (returnValue > maxSize) {continue;} else {break;}}}return thumbnailPath;} catch (IOException e) {e.printStackTrace();}return null;}
相关文章:
java生成图片缩略图
目录 前言一、使用Base64编码方式1、基本方法2、压缩本地图片保存到本地3、压缩网络图片到图片服务器 二、使用thumbnailator工具方式1、导入依赖2、压缩本地图片保存到本地 前言 下面介绍了两种获取图片缩略图的方式,全都不是一次性压缩,如果没有达到设…...
《统计学习方法》——隐马尔可夫模型(下)
学习算法 HMM的学习,在有观测序列的情况下,根据训练数据是否包含状态序列,可以分别由监督学习算法和无监督学习算法实现。 监督学习算法 监督学习算法就比较简单,基于已有的数据利用极大似然估计法来估计隐马尔可夫模型的参数。…...
Liunx top 命令详解
文章目录 top补充说明语法选项top交互命令实例 top 显示或管理执行中的程序 补充说明 top命令 可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 语法…...
基于 SpringBoot 的医院固定资产系统
本文将介绍基于 SpringBoot 技术的医院固定资产系统的设计和实现。医院固定资产管理是医疗机构管理工作的重要组成部分,它对医院的正常运营和管理具有重要的意义。本系统的设计和实现将有助于医疗机构更好地管理和维护其固定资产。 1. 系统需求分析 医院固定资产管…...
【企业信息化】第2集 免费开源ERP: Odoo 16 销售管理系统
文章目录 前言一、概览二、使用功能1.通过清晰报价提高销售效率2.创建专业报价单3.管理订单及合同4.简化沟通5.维护产品&价格6.直观的报告7.集成 三、总结 前言 世界排名第一的免费开源ERP: Odoo 16 销售管理系统。通过Odoo Sign应用程序和在线支付,发送报价。…...
浅谈数据治理
大家好 ,近年来,数据治理成为挖掘数据价值的重要手段和工具。随着大数据平台和工业互联网兴起,数据治理平台主要采用数据中台技术和微服务架构初步替代传统架构,面向大数据架构下,为数据资源中心与外部数据系统提供数据…...
Matlab入门教程003|MATLAB变量|MATLAB命令
MATLAB变量 每个MATLAB变量可以是数组或者矩阵。 用一个简单的方法指定变量。例如: x 3 % defining x and initializing it with a value MATLAB执行上述语句,并返回以下结果: x 3 上述的例子创建了一个1-1的矩阵名为x和的值存储…...
【啃书C++Primer5】-编写一个简单C++程序
每个C程序都包含一个或多个函数(function),其中一个必须命名为main。操作系统通过调用main来运行C程序。下面是一个非常简单的main函数,它什么也不干,只是返回给操作系统一个值: int main() {return 0; }一个函数的定义包含四部分:返回类型(r…...
GoView 是一个Vue3搭建的低代码数据可视化开发平台
一、总览 开源、精美、便捷的「数据可视化」低代码开发平台 二、整体介绍 框架:基于 Vue3 框架编写,使用 hooks 写法抽离部分逻辑,使代码结构更加清晰; 类型:使用 TypeScript 进行类型约束,减少未知错误…...
【面试篇】Redis持久化面试题
文章目录 Redis持久化🙎♂️面试官:什么是Redis持久化? AOF日志AOF日志原理🙎♂️面试官:AOF日志是怎么工作的/AOF写入磁盘的流程?🙎♂️面试官: 刚刚说到了Redis先执行写入的…...
哈工大软件过程与工具作业2
云原生技术云原生技术 哈尔滨工业大学 计算机科学与技术学院/国家示范性软件学院 2022年秋季学期 《软件过程与工具》课程 作业报告 作业 2:需求分析UML建模 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 需求概述...........…...
SDN控制器三平面(软件定义网络、OOB)
目录 又名 三个独立的平面或层 SDN数据流 控制流量的带外(OOB) 优势 技术...
嘉兴桐乡会计考证实操-考初级会计真的有用吗?
一边说着:考初级会计门槛太低了,谁都能考;一边又争先恐后的去报考,考初级会计真的是有用的吗?为什么这么多人一边说考了没用却一直在努力备考呢? 关于这类的话题,其实一直都存在,但不…...
约翰霍普金斯大学诺奖得主涉嫌造假,撤回5篇PNAS论文
2019年,约翰霍普金斯大学的著名基因医学科学家Gregg L. Semenza博士因为“发现细胞如何感知和适应氧气供应”,和另外两名科学家( William Kaelin Jr. and Peter J. Ratcliffe)分享当年的生理医学诺贝尔奖。 近期,Gregg…...
React的表单数据绑定
当我们在页面中使用表单提交数据时,react是如何拿取表单数据的呢 这里通过两种方式来实现 非受控组件实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…...
Dubbo——微服务框架(单体式->分布式->微服务)
是什么? Dubbo是阿里巴巴开源的基于Java的高性能RPC(一种远程调用)分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,它提供了三大核心能力:面向接口的远程…...
【Spring Cloud】Feign传递HttpServletRequest
这里我的业务场景是:在请求头中获取服务端登录时传给客户端的token,并且客户端将token放在请求头中。以至于我需要在参数传递上传入HttpServletRequest。如果你非要向我一样传入HttpServletRequest对象那么就往下看,当然你如果可以改成其他参…...
烟火识别智能监测系统 yolov5
烟火识别智能监测系统基于pythonyolov5网络模型算法智能分析技术,烟火识别智能监测算法模型对现场画面进行实时分析,发现现场出现烟火立即抓拍实时告警。我们选择当下卷积神经网络YOLOv5来进行火焰识别检测。6月9日,Ultralytics公司开源了YOL…...
【Python入门】Python循环语句(while循环的基础语法)
前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…...
JS中 Math 和 Number 内置对象常用的一些方法
JS中 Math 和 Number 内置对象常用的一些方法 Math.abs(num)Math.ceil(num)Math.floor(num)Math.max(num1, num2, ... , numN)Math.min(num1, num2, ... , numN)Math.pow(base, exponent)Math.random()Math.round(num)Math.sqrt(num)Number.toFixed(digits)Number.toString(rad…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
