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…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
