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

news2024/9/28 5:33:51

在这里插入图片描述

传入的是图片途径

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.coloradmin.cn/o/1073760.html

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

相关文章

演唱会远景拍摄不清晰,一招秒变神图!

演唱会现场拍摄的照片不清晰&#xff0c;画质很模糊&#xff0c;遇到这种情况的图片&#xff0c;我们可以利用图片处理工具修复清晰。 我们用像素低的手机拍照或者拍摄的物体太远时&#xff0c;往往会拍出很模糊的照片&#xff0c;但是你又没办法再捕捉到刚才那精彩的一幕&…

Maven 依赖管理

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目&#xff08;包含成百上千个模块或者子项目&#xff09;&#xff0c;模块间的依赖关系就变得非常复杂&#xff0c;管理也变得很困难。针对此种情形&#xff0c;Maven 提供了一种高度控制的方法。 可传递性依赖发现 …

掌握这3点,企业就能规避收款业务中的合规风险

随着国家政策监管日趋严格&#xff0c;企业合规管理正在受到高度关注。在企业收业务款场景中&#xff0c;银行回单管理容易被忽略&#xff0c;若处理不当&#xff0c;将面临合规风险。具体表现如下&#xff1a; 审计依据不充分 银行回单是企业内部控制和合规管理的重要组成部…

idea新建一个module时,文件夹显示灰色/pom.xml文件显示灰色且中间有条横线

1.问题 2.解决方法 File->Settings->Ignored Files->找到勾选的pom.xml文件&#xff0c;取消勾选&#xff0c;点击ok即可。 3.已解决

使用 Databend Kafka Connect 构建实时数据同步

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 hantmac (Jeremy) GitHub Kafka Connect 介绍 Kafka Connect 是一个用于在 Apache Kafka 和其他数据系统之间可扩展且可靠地流式传输数据的工具。通过将数据移入和移出 Kafka 进行标准化&#xff0c;使得快速定义连接器以在…

VBA技术资料MF68:更改所选区域边框颜色

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

039:mapboxGL更换地图上的鼠标样式

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中更换地图上的鼠标的样式。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共74行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…

赛事报名分组个人团体赛事小程序开发

基于ThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 版本&#xff1a;H5版本&#xff0c;目前只支持微信H5报名&#xff0c;公众号授权自动登录。 多动创建&#xff1a;支持多种活动创建&#xff0c;多种活动同时创建&…

【云原生】K8S对外服务之Ingress

目录 一、Ingress 简介1.1Ingress 组成1.3Ingress-Nginx 工作原理 二、部署 nginx-ingress-controller2.1部署ingress-controller Pod及相关资源2.2ingress 暴露服务的方式2.3 采用方式二&#xff1a;DaemonSetHostNetworknodeSelector 三、采用方式二&#xff1a;DeploymentNo…

DAZ To UMA⭐五.模型在Blender中的配置教程

文章目录 🟥 创建符合UMA的材质球属性1️⃣ 合并材质球🎁 选择材质球🎁 合并材质球🎁 删除多余材质球2️⃣ 将身体按材质球拆分🎁 进入身体编辑模式🎁 全选身体🎁 按材质分割身体🎁 重命名不同部位3️⃣ 将其余部位进行拆分🟧 更正选择缩放🟩 更新骨骼结构…

VMware和别的服务器 ,组建局域网那些事 。

利用VMware &#xff0c;实现组件局域网、有可能会受限于WiFi&#xff08;路由器&#xff09; 。 通常不会&#xff0c;除非做了网关设置 相关知识&#xff1a; 禁用局域网隔离&#xff08;LAN Isolation&#xff09;&#xff1a; 某些路由器提供了一个选项&#xff0c;允许您禁…

找不到msvcp120.dll怎么办?msvcp120.dll修复方法分享!

有时候&#xff0c;当你想运行某个程序时&#xff0c;可能会遇到一个错误提示&#xff1a;“找不到msvcp120.dll”。这个错误提示意味着你的计算机缺少了一个名为msvcp120.dll的动态链接库文件。当计算机无法找到这个文件时&#xff0c;你将无法正常运行或安装某些应用程序。下…

【Java题】模拟下载进度条

目录 一&#xff1a;题目 二&#xff1a;解析 1.匿名内部类 2.lambda 三&#xff1a;结果 一&#xff1a;题目 使用匿名内部类&#xff0c;模拟下载过程进度条&#xff0c;体会回调函数的作用。 1. 定义 DownloadListener 接口&#xff0c;包含一个包含 void progressU…

【轻松玩转MacOS】安全隐私篇

引言 这一篇将介绍如何保护MacOS的安全&#xff0c;包括如何设置密码&#xff0c;使用防火墙&#xff0c;备份数据等重要环节&#xff0c;避免因不慎操作或恶意攻击带来的安全风险&#xff0c;让你的MacOS之旅更安心、更放心。 一、设置密码&#xff1a;保护你的MacOS的第一道…

高级深入--day29

入门案例 学习目标 创建一个Scrapy项目定义提取的结构化数据(Item)编写爬取网站的 Spider 并提取出结构化数据(Item)编写 Item Pipelines 来存储提取到的Item(即结构化数据)一. 新建项目(scrapy startproject) 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目…

Maven 构建Java项目

Maven 使用原型 archetype 插件创建项目。要创建一个简单的 Java 应用&#xff0c;我们将使用 maven-archetype-quickstart 插件。 在下面的例子中&#xff0c;我们将在 C:\MVN 文件夹下创建一个基于 maven 的 java 应用项目。 命令格式如下&#xff1a; mvn archetype:gene…

语音转文字,功能更强大的工具

这次是从一个微信公众号发现的&#xff0c;尝试了一下其中的方法1&#xff0c;果然强大好用。 方法1 使用 OpenAI 开源的语音转文字模型 Whisper&#xff0c;通过这个模型可以实现语音转文字&#xff0c;即使是离线也能使用。 因为开源的 Whisper 需要通过 python 和命令行来执…

redis中高并发问题

高并发问题 Redis 做缓存虽减轻了 DBMS 的压力&#xff0c;减小了 RT&#xff0c;但在高并发情况下也是可能会出现各 种问题的。 1 缓存穿透 当用户访问的数据既不在缓存也不在数据库中时&#xff0c;就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓…

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域&#xff0c;以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧&#xff08;Stack …

排序算法——希尔排序

一、介绍: 希尔排序是一种可以减少插入排序中数据比较次数的排序算法&#xff0c;加速算法的进行&#xff0c;排序的原则是将数据区分为特定步长的小区块&#xff0c;然后以插入排序算法对小区块内部进行排序&#xff0c;经历过一轮排序则减少步长&#xff0c;直到所有数据都排…