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

在这里插入图片描述

传入的是图片途径

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,一经查实,立即删除!

相关文章

BuyVM 拉斯维加斯 VPS 测评

description: 发布于 2023-07-05 BuyVM 拉斯维加斯 VPS 测评 产品链接&#xff1a;https://my.frantech.ca/cart.php?gid37 G口不限制流量&#xff0c;抗一般投诉&#xff0c;不抗版权投诉。 中国大陆连通性尚可。 CPU&#xff0c;硬盘速度不错。 规格 $3.50 USD/mo 1G…

js验证字符串是否是时间日期格式

参考文章 验证字符串是否是时间日期格式 返回 布尔值 表示 Dayjs的日期是否通过校验。 不严格的校验 只检查传入的值能否被解析成一个时间日期 dayjs(2022-01-33).isValid(); // true, parsed to 2022-02-02dayjs(some invalid string).isValid(); // false严格校验 检查…

vue中使用ali-oss上传文件到阿里云上

1.使用 npm 安装ali-oss npm install ali-oss --save2.写ali-oss.js // 引入ali-oss let OSS require(ali-oss) let client new OSS({region: oss-cn-xxx, // bucket所在的区域&#xff0c; 默认oss-cn-hangzhousecure: true, // secure: 配合region使用&#xff0c;如果指…

生成多元正态数据

目录 一、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/搜索依赖&#…

【API要返回一棵树的结构】数据库表结构是平铺的数据,但是api要实现树状结构展示。api实现一棵树的结构,如何实现呢,递归?如何递归呢

数据库中的数据是平铺的&#xff0c;一行行的&#xff0c;但是api要查询出来的数据要求是一棵树的结构&#xff0c; 怎么把平铺的数据转换成树状结构呢&#xff1f; public List<CarbonRepo> findCarbonRepo(Integer type){// 1. 先查出所有数据。 baseFindList 方法就是…

基于Keil a51汇编 —— 程序模板文件以及规则

程序模板文件 下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。 $NOMOD51 ; 禁用预定义的 8051 寄存器 #include <reg52.h> // 包含头文件; ;根据需要更改小写名称。 ;该汇编模板让你…

[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()方法 : 该方法用…

【原理学习】互斥量机制与条件变量机制一起使用

互斥量机制 互斥量是多线程机制的一种。互斥量&#xff08;Mutex&#xff09;是一种用于实现线程互斥访问共享资源的机制&#xff0c;通过互斥量可以保证在同一时间内只有一个线程可以访问共享资源&#xff0c;从而避免多线程并发修改共享资源导致的数据不一致问题。 在多线程…

libgedit-amtk和amtk冲突不能升级

[SOLVED] Cant update the system / Pacman & Package Upgrade Issues / Arch Linux Forums sudo pacman -Rd amtk 单独删除 amtk 包就行了。

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

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:美容类产品找什么渠道做推广比较好~ 随着如今生活条件的进步&#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))…

深入浅出:react高阶成分(HOC)的应用

React中的HOC&#xff08;Higher-Order Component&#xff09;是一种高阶组件的模式&#xff0c;它是一个函数&#xff0c;接收一个组件作为参数&#xff0c;并返回一个新的包装组件。HOC可以用于增强组件的功能&#xff0c;例如添加属性、处理生命周期方法、共享状态等。 HOC…

【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 语文成绩,->…

spark3使用hive zstd压缩格式总结

ZSTD&#xff08;全称为Zstandard&#xff09;是一种开源的无损数据压缩算法&#xff0c;其压缩性能和压缩比均优于当前Hadoop支持的其他压缩格式&#xff0c;本特性使得Hive支持ZSTD压缩格式的表。Hive支持基于ZSTD压缩的存储格式有常见的ORC&#xff0c;RCFile&#xff0c;Te…

基于地理位置的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;淘宝网…