图片大小转换(对于图片进行压缩)

在这里插入图片描述

传入的是图片途径

import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.Base64;// 限制图像大小为4MB
public byte[] limitImageSize(File imageFile, int maxSizeInBytes) throws IOException {if (imageFile.length() <= maxSizeInBytes) {// 图像大小已经符合要求,无需压缩FileInputStream inputStream = new FileInputStream(imageFile);byte[] imageData = inputStream.readAllBytes();inputStream.close();return imageData;} else {// 图像大小超过4MB,需要压缩double compressionRatio = (double) maxSizeInBytes / imageFile.length();BufferedImage image = ImageIO.read(imageFile);int newWidth = (int) (image.getWidth() * Math.sqrt(compressionRatio));int newHeight = (int) (image.getHeight() * Math.sqrt(compressionRatio));BufferedImage compressedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);compressedImage.getGraphics().drawImage(image, 0, 0, newWidth, newHeight, null);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(compressedImage, "JPEG", outputStream);return Base64.getEncoder().encodeToString(outputStream.toByteArray());}
}

这段代码的主要目的是将给定的图像文件限制在指定的大小(4MB)以内,如果图像大小超过了这个限制,则对图像进行压缩,使其满足限制。以下是对这段代码的详细解释:

  1. limitImageSize 函数接受两个参数:imageFilemaxSizeInBytesimageFile 是要限制大小的图像文件,maxSizeInBytes 是要限制的最大图像大小,以字节为单位(例如4MB对应的字节数)。

  2. 首先,它检查图像文件的大小是否已经小于或等于指定的最大大小 (maxSizeInBytes)。如果是,就表示图像已经符合要求,无需进行压缩。在这种情况下,它会将图像文件的内容读取到一个 byte 数组 (imageData) 中。

  3. 如果图像大小超过了指定大小,它将计算一个压缩比例 (compressionRatio),以便将图像大小压缩到 maxSizeInBytes 以内。这里使用的是等比例压缩,根据压缩比例重新计算图像的宽度和高度。

  4. 创建一个新的 BufferedImage 对象 (compressedImage),作为压缩后的图像容器,然后使用 drawImage 方法将原始图像绘制到新的图像中,实现了压缩。

  5. 最后,将压缩后的图像数据写入到一个 ByteArrayOutputStream 中,以获取压缩后的图像的字节数组形式。

  6. 返回压缩后的图像数据,或者如果图像大小在限制内,则返回原始图像数据。

这段代码的主要目的是确保图像在传递给接口之前不超过指定的大小限制。如果图像已经符合要求,不需要压缩,而如果超过了大小限制,就会进行等比例压缩。

传入的是图片链接

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.Base64;// 下载远程图像并按照最大大小进行压缩
public String downloadAndCompressImage(String imageUrl, int maxSizeInBytes) throws IOException {URL url = new URL(imageUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();BufferedImage image = ImageIO.read(inputStream);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 计算压缩比例double compressionRatio = (double) maxSizeInBytes / (image.getWidth() * image.getHeight());if (compressionRatio < 1.0) {// 图像需要压缩int newWidth = (int) (image.getWidth() * Math.sqrt(compressionRatio));int newHeight = (int) (image.getHeight() * Math.sqrt(compressionRatio));BufferedImage compressedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);compressedImage.getGraphics().drawImage(image, 0, 0, newWidth, newHeight, null);ImageIO.write(compressedImage, "JPEG", outputStream);} else {// 图像不需要压缩,直接写入输出流ImageIO.write(image, "JPEG", outputStream);}inputStream.close();outputStream.close();// 将压缩后的图像数据转换为Base64字符串return Base64.getEncoder().encodeToString(outputStream.toByteArray());} else {throw new IOException("Failed to download image from URL: " + imageUrl);}
}

这段代码的主要功能是从指定的远程URL下载图像,然后根据指定的最大大小(以字节为单位)对图像进行压缩,最后将压缩后的图像数据以Base64字符串的形式返回。以下是对这段代码的详细介绍:

  1. downloadAndCompressImage 方法:这是主要的方法,用于下载、压缩和编码图像。

    • 参数 imageUrl:要下载的远程图像的URL。
    • 参数 maxSizeInBytes:要限制的图像最大大小(以字节为单位)。
  2. 下载图像

    • 通过创建 URL 对象和 HttpURLConnection 对象来建立与指定URL的HTTP连接。
    • 使用 GET 请求方法获取图像数据。
    • 检查HTTP响应码,如果是 HTTP_OK(状态码200),表示成功连接到URL并可以继续下载。
  3. 读取图像

    • 使用 InputStream 从HTTP连接中获取图像数据。
    • 使用 ImageIO.read(inputStream) 读取图像数据并将其加载到 BufferedImage 对象中。
  4. 压缩图像

    • 计算压缩比例 (compressionRatio),以确保图像不超过指定的最大大小。
    • 如果压缩比例小于1.0,表示图像需要压缩。
    • 计算新的宽度和高度,以便等比例压缩图像。
    • 创建一个新的 BufferedImage 对象 (compressedImage) 作为压缩后的图像容器,然后使用 drawImage 方法将原始图像绘制到新的图像中,实现了压缩。
    • 使用 ImageIO.write 将压缩后的图像数据写入到 ByteArrayOutputStream 中。
  5. 处理未压缩的图像:如果图像不需要压缩,直接将原始图像数据写入输出流中。

  6. 关闭流:关闭输入流和输出流,释放资源。

  7. Base64 编码:将压缩后的图像数据转换为Base64字符串,以便后续处理和传输。

  8. 返回结果:返回Base64编码后的图像数据。

  9. 错误处理:如果在连接或下载过程中发生错误,将抛出 IOException 异常,提供错误消息。

这段代码可以确保下载的图像不会超过指定的大小,并以Base64编码的形式返回,以便后续处理或传输。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成多元正态数据

目录 一、mvrnorm()函数使用介绍 例1&#xff1a;生成服从多元正态分布的数据 例2:生成一组服从多元正态分布的观测 一、mvrnorm()函数使用介绍 获取来自给定均值向量和协方差阵的多元正态分布的数据。 MASS包中的mvrnorm()函数可以让这个问题变得很容易&#xff0c;其调用…

win10搭建Selenium环境+java+IDEA(3)

这里主要对前面的maven和selenium做补充说明&#xff0c;以及更新一些pom文件下载依赖的问题。 IDEA里面&#xff0c;如果你创建的工程是maven工程文件&#xff0c;那么就会有一个pom.xml文件&#xff0c;可以在这个网站&#xff1a;https://mvnrepository.com/搜索依赖&#…

[PwnThyBytes 2019]Baby_SQL - 代码审计+布尔盲注+SESSION_UPLOAD_PROGRESS利用

[PwnThyBytes 2019]Baby_SQL 1 解题流程1.1 分析1.2 解题 2 思考总结 1 解题流程 1.1 分析 此题参考文章&#xff1a;浅谈 SESSION_UPLOAD_PROGRESS 的利用 访问正常来讲用ctf-wscan是能扫出source.zip文件的&#xff0c;且F12后提示了有source.zip&#xff0c;那我们就下载…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …

文件解析的方法与原理

文件的解析使用python的struct模块,接下来会用到的2个方法: 解包unpack()方法 : 使用该方法可以从写好的二进制文件中读出文件。它的函数原型为:struct.unpack(fmt,string),fmt参数是格式字符串。string表示要转换的python值。最终函数返回一个元组。 calcsize()方法 : 该方法用…

美容类产品找什么渠道做推广比较好,媒介盒子告诉你

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:美容类产品找什么渠道做推广比较好~ 随着如今生活条件的进步&#xff0c;越来越多人的女性开始注重对自身的保养。她们会在市场上搜罗大量的美容护肤类服务和产品&#xff0c;这也给了无…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

【MySQL】基本查询(三)聚合函数+group by

文章目录 一. 聚合函数二. group by子句结束语 建立如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment 语文成绩,->…

基于地理位置的IP地址定位技术

IP地址定位是指通过互联网上的IP地址&#xff0c;准确地定位出该IP地址对应的物理位置。IP地址是互联网上设备之间通信时使用的一个地址标识符&#xff0c;每个设备都有一个唯一的IP地址。 IP地址定位的原理是通过收集和分析网络设备的IP地址和相应的网络数据&#xff0c;以确定…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代&#xff0c;网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

淘宝商品链接获取淘宝商品详情数据(用 Python实现淘宝商品信息抓取)

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取淘宝多网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;淘宝网…

Python中如何快速解析JSON对象数组

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 由于浏览器可以迅速地解析JSON对象&#xff0c;它们有助于在客户端和服务器之间传输数据。 本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JavaSc…

【JavaEE】多线程(五)- 基础知识完结篇

多线程&#xff08;五&#xff09; 文章目录 多线程&#xff08;五&#xff09;volatile关键字保证内存可见性JMM&#xff08;Java Memory Model&#xff09; 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法&#xff0c;可用于评估系统对异常情况的响应。通过这种测试方法&#xff0c;可以发现系统中的潜在问题&#xff0c;并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

《向量数据库指南》——向量数据库 有必要走向专业化吗?

向量数据库 有必要走向专业化吗? 向量数据库系统的诞生,来源于具体业务需求——想要高效处理海量的向量数据,就需要更细分、更专业的数据基础设施,为向量构建专门的数据库处理系统。 但这种路径是必须的吗? 从产品层面讲,如果传统数据库厂商不单独研发向量数据库,那么…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件&#xff0c;最后用G汇总&#xff1a; GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动&#xff0c;当时我用的是UnityChan这个unity官方自带的插件做的裙摆…

javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图

创建ssmthymeleaf项目 创建ssmthymeleaf项目参考此文 thymeleaf更多常用标签 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title> …

【ccf-csp题解】第7次csp认证-第二题-俄罗斯方块-简单碰撞检测算法

题目描述 思路讲解 本题的主要思路是实现一个draw函数&#xff0c;这个函数可以绘制每一个状态的画布。然后从第一个状态往后遍历&#xff0c;当绘制到某一个状态发生碰撞时&#xff0c;答案就是上一个状态的画布。 此处的状态x实际就是在原来的15*10画布上的第x行开始画我们…

你必须知道的数据查询途径!!

在当今信息爆炸的时代&#xff0c;我们每天都会面临海量的数据和信息。如何在这些繁杂的信息中快速、准确地找到自己需要的内容&#xff0c;也是当代一个非常重要的技能。下面&#xff0c;我将介绍几种你必须知道的企业数据信息查找途径。 ​ 1. 搜索引擎 搜索引擎是我们日常中…