thumbnailator压缩预处理降低图片大小,并将图片存入Minio

在之前的项目中实现了通过minio实现对文件、图片的存储。在本篇文章中添加了通过thumbnailator预先实现图片压缩再上传至minio。(因为现在手机拍照的像素太高了!!每张照片动则近10M的大小,图片显示太慢啦!!!,所以尝试使用图片压缩来解决图片显示慢的问题)

以下是实现步骤 

1、引入maven依赖

<!-- thumbnailator依赖 -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

2、前置准备

由于我们项目中都是写一个统一的文件上传接口,也就是图片、文件等内容都是通过同一个接口上传的,但是我们只想要对图片进行压缩处理,所以得写一个判断方法,判断传入的参数是否为图片

/**
 * 判断文件是否为图片
 */
public boolean isPicture(String imgName) {
    boolean flag = false;
    if (StringUtils.isBlank(imgName)) {
        return false;
    }
    String[] arr = {"bmp", "dib", "gif", "jfif", "jpe", "jpeg", "jpg", "png", "tif", "tiff", "ico"};
    for (String item : arr) {
        if (item.equals(imgName)) {
            flag = true;
            break;
        }
    }
    return flag;
}

3、业务逻辑层处理

具体的业务逻辑实现步骤我都以注释的形式写到了方法块中~包括了minio实现文件上传的步骤,方便大家理解!

  public String fileUpload(MultipartFile multipartFile) {

        try {
            // 创建一个Minio的客户端对象
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(minioProperties.getEndpointUrl())
                    .credentials(minioProperties.getAccessKey(), minioProperties.getSecreKey())
                    .build();

            // 判断桶是否存在
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());
            if (!found) { // 如果不存在,那么此时就创建一个新的桶
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());
            } else { // 如果存在打印信息
                System.out.println("Bucket 'spzx-bucket' already exists.");
            }

            // 设置存储对象名称
            String dateDir = DateUtil.format(new Date(), "yyyyMMdd");
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String suffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
            String fileName = dateDir + "/" + uuid + multipartFile.getOriginalFilename();
            System.out.println(fileName);

            // 判断是否是图片并且大小超过100k
            if (isPicture(suffix) && multipartFile.getSize() > (1024 * 1024 * 0.1)) {
                // 缩放并调整图片质量
                //创建一个字节数组输出流,用来存储处理后的图片数据
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                double quality = 1.0;
                //根据上传图片的大小设置不同的压缩质量
                if (multipartFile.getSize() <= (1024 * 1024)) {
                    quality = 0.3;
                } else if (multipartFile.getSize() <= (1024 * 1024 * 2)) {
                    quality = 0.2;
                } else {
                    quality = 0.1;
                }
                Thumbnails.of(multipartFile.getInputStream())
                        .scale(1f)//1f表示不改变图片的尺寸,保持原始大小
                        .outputQuality(quality)//根据设置的质量参数进行压缩处理
                        .toOutputStream(outputStream);//将处理之后的图片数据输出到字节数组输出流中

                InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

                // 上传文件到MinIO
                PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                        .bucket(minioProperties.getBucketName())
                        .stream(inputStream, outputStream.size(), -1)
                        .object(fileName)
                        .build();
                minioClient.putObject(putObjectArgs);
            }
            else{
                PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                        .bucket(minioProperties.getBucketName())
                        .stream(multipartFile.getInputStream(), multipartFile.getSize(), -1)
                        .object(fileName)
                        .build();
                minioClient.putObject(putObjectArgs) ;
            }

            return minioProperties.getEndpointUrl() + "/" + minioProperties.getBucketName() + "/" + fileName;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

 4、测试

这里我上传了一张原图大小为652KB的图片,经测试通过thumbnailator压缩之后上传到minio保存的大小约为64KB,按照业务逻辑就是压缩到了它原来大小的0.1倍

5、总结

这里我只实现了图片的压缩,其实还可以加水印旋转等处理,剩下的等我下次有需求实现了再更新吧!(附上一些thumbnailator的用法)

(1)size(宽度、高度)   ----指定大小比例进行缩放(考虑图片完整度)

(2)scale(比例)----按照比例缩放0-1f

(3)rotate(90)----旋转90度

(4)sourceRegion(Positions.CENTER, 400,400) .size(200,200).keepAspectRatio(false)  ----剪切

(5)watermark(Positions.CENTER) ----加水印

注:具体用法还是去参照官网吧~写博客就是为了共勉,希望大家喜欢

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Minio 是一个开源的云存储服务,它提供了一种简单的方法来存储和检索对象(如文件、图像等)。关于使用 Minio 压缩图片Java 中,你可以按照以下步骤操作: 1. 安装 Minio SDK for Java: 首先,你需要在项目中添加 MinioJava SDK 库,可以通过 Maven 或 Gradle 的依赖管理来完成。 2. 连接 Minio: 使用 SDK 创建连接到你的 Minio 存储实例的客户端,通常需要提供服务器地址、访问 key 和 secret key。 ```java import io.minio.MinioClient; import io.minio.errors.MinioException; // ... MinioClient client = new MinioClient("http://your-minio-server:9000", "your-access-key", "your-secret-key"); ``` 3. 图片上传: 在上传图片之前,可以使用 Java 的 ImageIO 工具对图片进行压缩。例如,你可以使用 `JPEGImageIO` 对 JPEG 格式的图片进行压缩: ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; // ... try { BufferedImage image = ImageIO.read(new File("original.jpg")); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(resizedImage, "jpg", outputStream); byte[] compressedImageBytes = outputStream.toByteArray(); // 然后使用 Minio 客户端上传压缩后的图片 client.putObject("bucket-name", "compressed-image.jpg", compressedImageBytes); } catch (IOException e) { e.printStackTrace(); } ``` 4. 压缩策略: Minio本身并不直接提供图片压缩功能,但你可以结合第三方库(如 Apache Commons Imaging 或者 OpenCV)来处理图片压缩,然后上传。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值