图片的处理库Thumbnailator

news2024/9/21 14:33:44

摘要:最近遇到图片处理的问题,借助了Thumbnailator库,记录下使用步骤如下……

         图片处理,JDK中也提供了对应的工具类,不过处理较麻烦,Thumbnailator 是Google一个 开源Java 图像处理库,用于简化 Java 中对图像进行缩放、裁剪和添加水印等操作。GitHub - coobird/thumbnailator: Thumbnailator - a thumbnail generation library for JavaThumbnailator - a thumbnail generation library for Java - coobird/thumbnailatoricon-default.png?t=N7T8https://github.com/coobird/thumbnailator        通过 Thumbnailator开发人员可以轻松地对图像进行各种处理,而不必关心复杂的细节,参考Thumbnailator给出的Examples很详细的介绍了其多个使用功能。

1. Thumbnailator介绍

        Thumbnails.of() 方法就是 Thumbnailator 提供的一个入口方法,用于创建一个图像处理对象,其对图片的处理支持链式操作,使用Thumbnailator大致可完成如下操作:

  • 生成缩略图: 通过指定目标尺寸,可以轻松地生成原始图像的缩略图;
  • 添加水印: 可以在图像上方便地添加文本或其他图像作为水印;
  • 旋转和翻转: 支持对图像进行旋转和翻转操作;
  • 批量处理: 能够方便地对多个图像进行批量处理,生成一组缩略图;
  • 格式转换: 可以将图像转换为不同的格式,如 JPEG、PNG 等;
  • 链式调用: 支持链式调用,可以在一行代码中实现多个操作,使代码更加简洁和易读。
// 切割
Thumbnails.of(path + "caomei.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 200,200).size(200,200).toFile(path+"crop.jpg");
// 缩放: 分为按比例缩放scale和按长宽缩放size
Thumbnails.of(path + "caomei.jpg").scale(0.7).toFile(path+"scale1.jpg");
Thumbnails.of(path + "caomei.jpg").scale(1.5).toFile(path+"scale2.jpg");
Thumbnails.of(path + "caomei.jpg").size(500, 500).keepAspectRatio(false).toFile(path+"size1.jpg");
// keepAspectRatio(true)等比缩放
Thumbnails.of(path + "caomei.jpg").size(500,500).keepAspectRatio(true).toFile(path+"size2.jpg");
// 旋转
Thumbnails.of(path + "caomei.jpg").size(500,500).keepAspectRatio(true).rotate(90).toFile(path+"size2.jpg");

2. 项目中使用Thumbnailator

        项目中使用Thumbnailator步骤也很简单,下面实现上传图片接口,将缩放图片,并返回图片链接。

        首先,依旧是pom.xml中配置,并使用Maven引入依赖

<!-- 图片处理依赖 -->
<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
  <version>0.4.14</version>
</dependency>

        然后,就可以在具体方法中使用Thumbnailator。例如,在上传图片时,设置图片尺寸,添加水印并使用新名称保存,实现如下:

// 为了在图片地址中保存URL,传入HttpServletRequest
@PostMapping("admin/upload/image")
public ApiRestResponse uploadImage(HttpServletRequest httpServletRequest, @RequestParam("file") MultipartFile file) throws IOException {
    // 获取上传文件原始名称
    String fileName = file.getOriginalFilename(); //fileName: logo.png
    // 获取图片文件格式,后缀
    String suffixName = fileName.substring(fileName.lastIndexOf(".")); // suffixName: .png
    // 生成文件名称UUID
    UUID uuid = UUID.randomUUID();
    String newFileName = uuid.toString() + suffixName; // newfileName: b93fee5a-271c-4922-b57e-99b5c3413d82.png
    // 创建文件夹
    File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
    File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
    if (!fileDirectory.exists()) { //文件夹不存在,则创建fileDirectory.mkdir()
        if (!fileDirectory.mkdir()) {
            throw new ImoocMallException(ImoocMallExceptionEnum.MKDIR_FAILED);
        }
    }
    try {
        file.transferTo(destFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 对目标文件进行缩略图处理,并添加水印
    Thumbnails.of(destFile) // 选择目标文件
            .size(Constant.IMAGE_SIZE, Constant.IMAGE_SIZE) // 设置缩略图大小
            .watermark(
                    Positions.BOTTOM_RIGHT, // 设置水印位置为右下角
                    ImageIO.read(new File(Constant.FILE_UPLOAD_DIR + Constant.WATER_MARK_JPG)), // 读取水印图片
                    Constant.IMAGE_OPACITY // 设置水印透明度
            )
            .toFile(new File(Constant.FILE_UPLOAD_DIR + newFileName)); // 输出处理后的文件到指定路径
    try {
        return ApiRestResponse.success(getHost(new URI(httpServletRequest.getRequestURL()+""))+"/images/"+newFileName);
    } catch (URISyntaxException e) {
        return ApiRestResponse.error(ImoocMallExceptionEnum.UPLOAD_FAILED);
    }
}

        通过上述方法可以缩放并添加CSDN作为水印的图片如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481608.html

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

相关文章

力扣:35. 搜索插入位置

力扣&#xff1a;35. 搜索插入位置 描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,…

MySQL5.7.44版本压缩包在Win11系统快速安装

一.背景 主要还是为了公司的带徒弟任务。我自己也喜欢MySQL的绿色版本。 1.软件版本说明 MySQL版本&#xff1a;5.7.44 压缩包版本&#xff0c;相当于绿色版。当然&#xff0c;你也可以使用window系统的Installer版本去安装。 操作系统&#xff1a;Win11家庭版 二.MySQL软…

MYSQL--JDBC*

一.介绍: 1.JDBC是一种用于执行SQL于语句的JAVA API,JDBC是一种使用JAVA访问数据库的执行规范标准,能够为不同的数据库提供统一的访问!由一组使用JAVA语言编写的接口以及类组成的 2.JDBC核心的类以及相关的接口主要有: DriverManager 注册驱动 Connection 使用…

期货开户坚持固定的盈利模式

1、超级操盘手比的往往不是技术&#xff0c;而是素质。成功的交易者有着一种与众不同的品质&#xff0c;他们拥有正确的思维方式&#xff0c;严谨的交易态度&#xff0c;强烈的自信心、果敢&#xff0c;和面对失败永不言败的精神&#xff0c;即使在系统最困难的时候&#xff0c…

C++ //练习 10.14 编写一个lambda,接受两个int,返回它们的和。

C Primer&#xff08;第5版&#xff09; 练习 10.14 练习 10.14 编写一个lambda&#xff0c;接受两个int&#xff0c;返回它们的和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************************…

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N&#xff0c;接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相…

使用MyBatisPlus实现向数据库中存储List类型的数据

使用MyBatisPlus实现向数据库中存储List类型的数据 问题描述 建表时&#xff0c;表中的这五个字段为json类型 但是在入库的时候既不能写入数据&#xff0c;也不能查询出数据。 解决方案&#xff1a; 1.首先明确&#xff0c;数据存入的时候是经过了数据类型转化&#xff0c…

Nacos配置

目录 启动nacos 项目步骤 Nacos服务分级存储模型​编辑 服务跨域集群调用问题 NacosRule负载均衡 服务实例的权重设置 环境隔离-namespace Nacos环境隔离 Nacos和Eureak对比 临时实例和非临时实例 Ncaos与Eureka的共同点 Nacos与Eureka的区别 Nacos配置管理 统一配…

Linux 系统安装/卸载 Nginx教程

优质博文&#xff1a;IT-BLOG-CN 一、安装Nginx 【1】首先通过Nginx官网确定需要安装的版本&#xff0c;如果Linux联网则直接在Linux服务上使用wget命令将Nginx安装包下载到/usr/local/目录下&#xff1a; [rootxxx local]# wget -c http://nginx.org/download/nginx-1.22.1.…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 我们思考一下窗口间的关系&#xff0c;窗口创建和销毁的一些动作&#xff0c;例如父子窗口&#xff0c;窗口组合等等&#xff0c;还有…

[HackMyVM]靶场 Adria

kali:192.168.56.104 主机发现 arp-scan -l 靶机:192.168.56.108 端口扫描 nmap -p- 192.168.56.108 开启了 22 80 139 445端口 进入web 编辑 /etc/hosts&#xff0c;把192.168.56.108 adria.hmv添加进去重新访问 里面没什么有用的东西&#xff0c;注册需要邮箱&#xff0c;…

LLM+RAG: 关于知识问答优化的思考总结

本文分享实践中对LLMRAG实现知识问答系统的相关调研和思考。 LLM的知识库问答有3种实现路径&#xff1a;RAG 或 微调&#xff0c;或两者结合。而RAG和微调都各有利弊&#xff0c;比如说&#xff1a; - RAG&#xff1a; 低成本易部署&#xff0c;适用于知识会更新的场景&#…

【兔子机器人】五连杆运动学解算与VMC(virtual model control)

VMC (virtual model control&#xff0c;虚拟模型控制) 是一种直觉控制方式&#xff0c;其关键是在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力。虚拟力不是实际执行机构的作用力或力矩&#xff0c;而是通过执行机构的作用经过机构转换而成。对于一些控制问题…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

PowerBI怎么修改数据库密码

第一步&#xff1a;点击转换数据 第二步&#xff1a;点击数据源设置 第三步&#xff1a;点击编辑权限 第四步&#xff1a;点击编辑 第五步&#xff1a;输入正要修改的密码就可以了

c++中使用lambda表达式的作用和用法

lambda表达式&#xff1a; 这是C11引入的一种新特性&#xff0c;它可以让您在需要定义函数对象的地方&#xff0c;直接编写一个匿名的、可以捕获上下文变量的函数体&#xff0c;非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似&#xff0c;也有…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget&#xff0c;可以安装一下&#xff0c;有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

pdf.js使用步骤

使用pdfjs 网页在线预览需要后端服务器支持 1、下载PDF.js 源码包 地址&#xff1a;PDF.js 2、解压源码包&#xff0c;将源码包放置到后端服务器 3、后端部署完成后 访问 viewer.html 类似上图 4、访问在线pdf文件 http://localhost:8081/web/viewer.html?filexxxx.pdf …

超好用的自动化测试工具——Python脚本

前言 ⾃动化测试会越来越受到重视 在移动互联⽹时代&#xff0c;对于质量的要求⽐PC时代⾼的多&#xff0c;⽽投⼊产出⽐最⾼的⾃动化测试&#xff0c;将会是⼤部分公司的⾸选⽅向&#xff0c;但需要严格掌握⼀门语⾔。 快速、高效的测试工具及脚本&#xff0c;能使程序猿的…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论&#xff08;4&#xff09; Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…