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

在这里插入图片描述

传入的是图片途径

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编码的形式返回,以便后续处理或传输。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小辉同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值