当前位置: 首页 > news >正文

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、压缩本地图片保存到本地 前言 下面介绍了两种获取图片缩略图的方式&#xff0c;全都不是一次性压缩&#xff0c;如果没有达到设…...

《统计学习方法》——隐马尔可夫模型(下)

学习算法 HMM的学习&#xff0c;在有观测序列的情况下&#xff0c;根据训练数据是否包含状态序列&#xff0c;可以分别由监督学习算法和无监督学习算法实现。 监督学习算法 监督学习算法就比较简单&#xff0c;基于已有的数据利用极大似然估计法来估计隐马尔可夫模型的参数。…...

Liunx top 命令详解

文章目录 top补充说明语法选项top交互命令实例 top 显示或管理执行中的程序 补充说明 top命令 可以实时动态地查看系统的整体运行情况&#xff0c;是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面&#xff0c;用热键可以管理。 语法…...

基于 SpringBoot 的医院固定资产系统

本文将介绍基于 SpringBoot 技术的医院固定资产系统的设计和实现。医院固定资产管理是医疗机构管理工作的重要组成部分&#xff0c;它对医院的正常运营和管理具有重要的意义。本系统的设计和实现将有助于医疗机构更好地管理和维护其固定资产。 1. 系统需求分析 医院固定资产管…...

【企业信息化】第2集 免费开源ERP: Odoo 16 销售管理系统

文章目录 前言一、概览二、使用功能1.通过清晰报价提高销售效率2.创建专业报价单3.管理订单及合同4.简化沟通5.维护产品&价格6.直观的报告7.集成 三、总结 前言 世界排名第一的免费开源ERP: Odoo 16 销售管理系统。通过Odoo Sign应用程序和在线支付&#xff0c;发送报价。…...

浅谈数据治理

大家好 &#xff0c;近年来&#xff0c;数据治理成为挖掘数据价值的重要手段和工具。随着大数据平台和工业互联网兴起&#xff0c;数据治理平台主要采用数据中台技术和微服务架构初步替代传统架构&#xff0c;面向大数据架构下&#xff0c;为数据资源中心与外部数据系统提供数据…...

Matlab入门教程003|MATLAB变量|MATLAB命令

MATLAB变量 每个MATLAB变量可以是数组或者矩阵。 用一个简单的方法指定变量。例如&#xff1a; x 3 % defining x and initializing it with a value MATLAB执行上述语句&#xff0c;并返回以下结果&#xff1a; x 3 上述的例子创建了一个1-1的矩阵名为x和的值存储…...

【啃书C++Primer5】-编写一个简单C++程序

每个C程序都包含一个或多个函数(function)&#xff0c;其中一个必须命名为main。操作系统通过调用main来运行C程序。下面是一个非常简单的main函数&#xff0c;它什么也不干&#xff0c;只是返回给操作系统一个值: int main() {return 0; }一个函数的定义包含四部分:返回类型(r…...

GoView 是一个Vue3搭建的低代码数据可视化开发平台

一、总览 开源、精美、便捷的「数据可视化」低代码开发平台 二、整体介绍 框架&#xff1a;基于 Vue3 框架编写&#xff0c;使用 hooks 写法抽离部分逻辑&#xff0c;使代码结构更加清晰&#xff1b; 类型&#xff1a;使用 TypeScript 进行类型约束&#xff0c;减少未知错误…...

【面试篇】Redis持久化面试题

文章目录 Redis持久化&#x1f64e;‍♂️面试官&#xff1a;什么是Redis持久化&#xff1f; AOF日志AOF日志原理&#x1f64e;‍♂️面试官&#xff1a;AOF日志是怎么工作的/AOF写入磁盘的流程&#xff1f;&#x1f64e;‍♂️面试官&#xff1a; 刚刚说到了Redis先执行写入的…...

哈工大软件过程与工具作业2

云原生技术云原生技术 哈尔滨工业大学 计算机科学与技术学院/国家示范性软件学院 2022年秋季学期 《软件过程与工具》课程 作业报告 作业 2&#xff1a;需求分析UML建模 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 需求概述...........…...

SDN控制器三平面(软件定义网络、OOB)

目录 又名 三个独立的平面或层 SDN数据流 控制流量的带外(OOB) 优势 技术...

嘉兴桐乡会计考证实操-考初级会计真的有用吗?

一边说着&#xff1a;考初级会计门槛太低了&#xff0c;谁都能考&#xff1b;一边又争先恐后的去报考&#xff0c;考初级会计真的是有用的吗&#xff1f;为什么这么多人一边说考了没用却一直在努力备考呢&#xff1f; 关于这类的话题&#xff0c;其实一直都存在&#xff0c;但不…...

约翰霍普金斯大学诺奖得主涉嫌造假,撤回5篇PNAS论文

2019年&#xff0c;约翰霍普金斯大学的著名基因医学科学家Gregg L. Semenza博士因为“发现细胞如何感知和适应氧气供应”&#xff0c;和另外两名科学家&#xff08; William Kaelin Jr. and Peter J. Ratcliffe&#xff09;分享当年的生理医学诺贝尔奖。 近期&#xff0c;Gregg…...

React的表单数据绑定

当我们在页面中使用表单提交数据时,react是如何拿取表单数据的呢 这里通过两种方式来实现 非受控组件实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…...

Dubbo——微服务框架(单体式->分布式->微服务)

是什么&#xff1f; Dubbo是阿里巴巴开源的基于Java的高性能RPC&#xff08;一种远程调用&#xff09;分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案&#xff0c;它提供了三大核心能力&#xff1a;面向接口的远程…...

【Spring Cloud】Feign传递HttpServletRequest

这里我的业务场景是&#xff1a;在请求头中获取服务端登录时传给客户端的token&#xff0c;并且客户端将token放在请求头中。以至于我需要在参数传递上传入HttpServletRequest。如果你非要向我一样传入HttpServletRequest对象那么就往下看&#xff0c;当然你如果可以改成其他参…...

烟火识别智能监测系统 yolov5

烟火识别智能监测系统基于pythonyolov5网络模型算法智能分析技术&#xff0c;烟火识别智能监测算法模型对现场画面进行实时分析&#xff0c;发现现场出现烟火立即抓拍实时告警。我们选择当下卷积神经网络YOLOv5来进行火焰识别检测。6月9日&#xff0c;Ultralytics公司开源了YOL…...

【Python入门】Python循环语句(while循环的基础语法)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为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…...

KS31:4-20mA设备如何低成本接入LoRaWAN实现无线化改造

一、为什么 4-20mA 设备难以实现无线化&#xff1f; 在工业自动化、楼宇运维以及能源管理场景中&#xff0c; 大量设备依然采用 4-20mA 标准信号输出&#xff0c;例如&#xff1a; 热电偶、PT100 变送器压力、液位、流量仪表各类环境监测设备 这些设备长期稳定运行&#xff0c;…...

如何用 port.start 开启共享子线程与主页面的长连接通道

port.start() 并非开启长连接的方法&#xff0c;而是启用 MessagePort 消息接收队列的必要操作&#xff0c;需在获取 port 后显式调用以开始接收消息&#xff0c;尤其在未设置 onmessage 时&#xff1b;它属于 MessageChannel 通信机制&#xff0c;不涉及网络连接。port.start …...

毫秒级响应!NEURAL MASK幻镜RMBG-2.0模型部署与推理加速教程

毫秒级响应&#xff01;NEURAL MASK幻镜RMBG-2.0模型部署与推理加速教程 1. 为什么你需要一个更好的抠图工具&#xff1f; 如果你曾经尝试过给照片换背景&#xff0c;尤其是处理带发丝的人像、半透明的婚纱或者边缘复杂的物体&#xff0c;你大概率会感到头疼。传统的抠图工具…...

Phi-4-Reasoning-Vision镜像免配置指南:双卡4090环境下模型加载进度条UI实现

Phi-4-Reasoning-Vision镜像免配置指南&#xff1a;双卡4090环境下模型加载进度条UI实现 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡4090环境优化设计。这个工具解决了大模型部署中的几个…...

3分钟实现GitHub界面本地化:开源界面翻译工具的完整指南

3分钟实现GitHub界面本地化&#xff1a;开源界面翻译工具的完整指南 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在为GitHub的英…...

[实战] STM32H743 SAI双缓冲DMA实现零延迟音频流处理

1. 为什么需要零延迟音频流处理&#xff1f; 在嵌入式音频开发中&#xff0c;实时性往往是决定系统成败的关键因素。想象一下&#xff0c;当你对着智能音箱说"播放音乐"时&#xff0c;如果系统需要等待几百毫秒才有反应&#xff0c;这种体验会让人抓狂。同样在专业音…...

部署Doris存算一体集群

部署Doris存算一体集群 1. 下载 doris安装包 https://doris.apache.org/zh-CN/download 2. 安装jdk&#xff08;所有节点执行&#xff09; 2.1 解压 tar -zxvf jdk-17.0.17_linux-x64_bin.tar.gz -C /data/java配置环境变量 vim /etc/profile增加如下配置 export JAV…...

有时候系统很卡是不是因为这个360

简单来说&#xff1a;Windows 可以杀死病毒&#xff0c;但很难杀死一个“用户请进来的、伪装成合法服务的商业软件”。让我们拆解一下为什么它能在 Windows 上“寄生”得如此成功&#xff1a;1. 核心原因&#xff1a;用户主动授予了它“最高权限”这是最根本的一点。360 不是病…...

【紧急预警】AIAgent服务注册中心已成单点瓶颈!4种去中心化治理方案对比实测(QPS提升3.8倍,延迟压降至8ms)

第一章&#xff1a;AIAgent架构服务治理方案 2026奇点智能技术大会(https://ml-summit.org) AIAgent系统在规模化部署中面临服务异构性高、生命周期动态性强、策略协同复杂等挑战&#xff0c;传统微服务治理模式难以支撑其可观测性、弹性扩缩与策略闭环能力。本章聚焦于构建面…...

VeraCrypt加密U盘实战:从创建加密卷到日常使用的完整指南

VeraCrypt加密U盘实战&#xff1a;从零开始打造移动数据保险箱 在这个数据泄露事件频发的时代&#xff0c;我们随身携带的U盘和SD卡就像一个个行走的数据炸弹。想象一下&#xff0c;当你遗失了存有客户资料、财务报告或个人隐私的移动存储设备时&#xff0c;那种头皮发麻的感觉…...