写给大忙人看的 – Java中图片压缩上传至MinIO服务器(4)[通俗易懂]

写给大忙人看的 – Java中图片压缩上传至MinIO服务器(4)[通俗易懂]之前文章已经介绍了MinIO的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法1、背景最近客户总抱怨APP中图片显示较慢,升级服务器带宽又没有多的预算,查看原因,是因为现在大家都是用的智能手机拍照,拍出来的照片小则2-3M,大则十几M,所以导致图片显示较慢。思考再三,决定将图片进行压缩再上传图片服务器来解决图片显示慢的问题

大家好,又见面了,我是你们的朋友全栈君。

之前文章已经介绍了 MinIO 的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法

1、背景

最近客户总抱怨 APP 中图片显示较慢, 升级服务器带宽又没有多的预算。查看原因,是因为现在大家都是用的智能手机拍照,拍出来的照片小则 2-3 M,大则十几 M,所以导致图片显示较慢。思考再三,决定将图片进行压缩再上传图片服务器来解决图片显示慢的问题

2、开发前戏

1、引入 maven 依赖

<!-- 图片压缩 -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

本次我们选择了使用 thumbnailator 来作为压缩的工具

2、thumbnailator 简介

  • Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图
  • 支持图片缩放,区域裁剪,水印,旋转,保持比例

3、压缩前戏

  • 判断是否是图片方法
/** * 判断文件是否为图片 */
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、压缩上传

/** * 上传文件 * * @param file 文件 * @return */
public JSONObject uploadFile(MultipartFile file) throws Exception { 
   
    JSONObject res = new JSONObject();
    res.put("code", 500);
    // 判断上传文件是否为空
    if (null == file || 0 == file.getSize()) { 
   
        res.put("msg", "上传文件不能为空");
        return res;
    }
    // 判断存储桶是否存在
    if (!client.bucketExists("test")) { 
   
        client.makeBucket("test");
    }
    // 拿到文件后缀名,例如:png
    String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
    // UUID 作为文件名
    String uuid = String.valueOf(UUID.randomUUID());
    // 新的文件名
    String fileName = DateUtils.getYyyymmdd() + "/" + uuid + "." + suffix;
    /** * 判断是否是图片 * 判断是否超过了 100K */
    if (isPicture(suffix) && (1024 * 1024 * 0.1) <= file.getSize()) { 
   
        // 在项目根目录下的 upload 目录中生成临时文件
        File newFile = new File(ClassUtils.getDefaultClassLoader().getResource("upload").getPath() + uuid + "." + suffix);
        // 小于 1M 的
        if ((1024 * 1024 * 0.1) <= file.getSize() && file.getSize() <= (1024 * 1024)) { 
   
            Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.3f).toFile(newFile);
        }
        // 1 - 2M 的
        else if ((1024 * 1024) < file.getSize() && file.getSize() <= (1024 * 1024 * 2)) { 
   
            Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.2f).toFile(newFile);
        }
        // 2M 以上的
        else if ((1024 * 1024 * 2) < file.getSize()) { 
   
            Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.1f).toFile(newFile);
        }
        // 获取输入流
        FileInputStream input = new FileInputStream(newFile);
        // 转为 MultipartFile
        MultipartFile multipartFile = new MockMultipartFile("file", newFile.getName(), "text/plain", input);
        // 开始上传
        client.putObject("test", fileName, multipartFile.getInputStream(), file.getContentType());
        // 删除临时文件
        newFile.delete();
        // 返回状态以及图片路径
        res.put("code", 200);
        res.put("msg", "上传成功");
        res.put("url", minioProp.getEndpoint() + "/" + "test" + "/" + fileName);
    }
    // 不需要压缩,直接上传
    else { 
   
        // 开始上传
        client.putObject("test", fileName, file.getInputStream(), file.getContentType());
        // 返回状态以及图片路径
        res.put("code", 200);
        res.put("msg", "上传成功");
        res.put("url", minioProp.getEndpoint() + "/" + "test" + "/" + fileName);
    }
    return res;
}
  • 这里我们判断了当文件为图片的时候,且当它大小超过了 (1024 * 1024 * 0.1),约为 100K 的时候,才进行压缩
  • 我们首先在根目录下的 upload 目录中创建了一个临时文件 newFile
  • Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.3f).toFile(newFile);将压缩后的文件输出到临时文件中
  • 然后将 FileInputStream 转为 MultipartFile 上传
  • 最后删除临时文件 newFile.delete();
  • 完成图片压缩上传

4、测试

  • 原图 706K

原图

  • 压缩后 120K

压缩后

5、总结

  • 综合以上代码,可以看出 Thumbnails 对图片的处理是很方便的,且代码量也非常少
  • 通过测试,可以看出压缩后的图片质量也很高
  • thumbnailator 对图片的处理支持全面,缩放,裁剪等

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150420.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm断点调试教程_pycharm怎么debug

    pycharm断点调试教程_pycharm怎么debug前言如果你不会用IDE开发工具的debug,你在调试代码的时候可能会用print输出去调试,那样效率比较低。我们可以用Pycharm的debug来调试,当然如果你用的Jetbranis的其他产品,操作方法也是一样的。Pycharm的Debug(1)开启debug的方式:右键debug项目 工具栏的甲壳虫(2)常用按钮图解debugger栏:stepover(单步调试)程序代码越过子函数,但子函数会执行,且不进入。 stepinto(进入)在单步执行时,遇到子函数就进入.

    2022年8月26日
    6
  • ANT1.7下载以及配置方法「建议收藏」

    ANT1.7下载以及配置方法「建议收藏」 http://www.apache.org/dist/ant/binaries/ 下的apache-ant-1.7.1-bin.zip   ;解压之后放在你的目录下,我一般放在C盘。ant的配法: 1。解压ant的包到本地目录。 2。在环境变量中设置ANT_HOME,值为你的安装目录。 3。在环境变量中设置JAVA_HOME,值为你的jdk安装目录。 4。把ANT_HOME/bin加到你系统

    2022年7月15日
    10
  • 对比HTML和XML[通俗易懂]

    对比HTML和XML[通俗易懂]对比HTML和XML

    2022年4月24日
    55
  • Eclipse 运行时弹出A Java Exception has occurred

    Eclipse 运行时弹出A Java Exception has occurred错误原因:较高版本的JDK编译的javaclass文件试图在较低版本的JVM上运行而产生的错误。首先,因为之前jdk版本是10,后来安装了jdk1.7,想用1.7的,但是由于eclipse的编译器中仍然使用原来的版本所以导致错误。因为我用的eclipse的编译器来编译的。因为很多编译器都自带javac,而不是采用操作系统中的编译器。如果你的编译器是eclipse的话,那么需要在项目的属性里设置j…

    2022年7月14日
    20
  • 不是单组分组函数「建议收藏」

    不是单组分组函数「建议收藏」问题:一:SELECT tablespace_name, SUM(bytes) freeFROM dba_free_space不是单组分组函数原因: 1、如果程序中使用了分组函数,则有两种情况可以使用:程序中存在group by,并指定了分组条件,这样可以将分组条件一起查询出来改为:  SELECT tablespace_name, SUM(bytes) freeFROM dba_free_spa…

    2022年6月30日
    25
  • JAVA Calendar方法详解「建议收藏」

    JAVA Calendar方法详解「建议收藏」 究竟什么是一个Calendar呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢?比如有:月份的定义-阳`(公)历一年12个月,每个月的天数各不同;阴(农)历,每个月固定28天每周的第一天-阳(公)历星期日是第一天;阴(农)历,星期一是第一天实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个人的生日是”八月八日”

    2022年6月1日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号