图片的处理库Thumbnailator

摘要:最近遇到图片处理的问题,借助了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// 生成文件名称UUIDUUID 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.hqwc.cn/news/502193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】面试手撕节流

引入 上篇我们讲了防抖&#xff0c;这篇我们就谈谈防抖的好兄弟 – 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。 PS: 开源节流中节流与这个技术上的节流&#xff0c;个人认为本质上是一样的。 开源节流的节流指的是节省公司的金钱开支。前端技术上的…

UE4c++ 材质功能大全(想起来就补充一个)

前言&#xff1a;才想起写一个这个文档&#xff0c;前期内容较少&#xff0c;其他内容&#xff0c;我也只会想起来加一加&#xff01; 材质功能大全 竖直百分比进度HSV To RGBRGB转灰度值AlphaComosote(Premultiplied Alpha&#xff09;预乘 转 Translucent &#xff08;sRGB与…

Java ElasticSearch-Linux面试题

Java ElasticSearch-Linux面试题 前言1、守护线程的作用&#xff1f;2、链路追踪Skywalking用过吗&#xff1f;3、你对G1收集器了解吗&#xff1f;4、你们项目用的什么垃圾收集器&#xff1f;5、内存溢出和内存泄露的区别&#xff1f;6、什么是Spring Cloud Bus&#xff1f;7、…

C++ 补充之常用排序算法

C 补充之常用排序算法 常用的排序算法主要包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序&#xff0c;下面简单介绍一下它们的概念和原理&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 冒泡排序是一种基础的排序算法&#xff0c;它重…

幸运星数(爷再也不想用pow了)

解法&#xff1a; 暴力 #include <iostream> #include <vector> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int n;long long sum 0, a;cin >> n;for (int i 1; i < n; i) {a 1;for (in…

【C++】结构体内存对齐详解

规则 1.第一个成员在结构体变量偏移量为0 的地址处&#xff0c;也就是第一个成员必须从头开始。 2.其他成员的偏移量为对齐数**(该成员的大小 与 编译器默认的一个对齐数 中的较小值)**的整数倍。 3.结构体总大小对最大对齐数&#xff08;通过最大成员来确定&#xff09;的整数…

包管理工具之npm也慌了?

起因 因为npm的种种问题,我很早就换成了pnpm和yarn(但是其实npm也在使用),已经很久没有关注npm的功能更新了。最近无意间进入Node18版本的安装目录,发现其除了常规的node,npm等默认安装了一个新的包corepack,这个就是今天我要分享的东西了。 注: 我因为18版本的node上…

Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置

一、创建SpringBoot项目 用mavan搭建也可以。&#xff08;重要的是后面pom里应该引入那些依赖&#xff0c;application.yml怎么配置&#xff09; 由于开始构建项目时选择了Eureka Server&#xff0c;所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…

【爬虫逆向实战 逆向滑块 Python+Node】今天逆向的网站有点嘿嘿,还是仅供学习,别瞎搞

逆向日期&#xff1a;2024.03.01 使用工具&#xff1a;Node.js、Python 加密方法&#xff1a;AES标准算法 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算…

让人春分日 梦熊联盟2023比赛成绩,山西太恐怖

本人是山东人&#xff0c;山东66人 但 没想到山西有77个人&#xff01;&#xff01;&#xff01; 泰酷辣 听懂掌声&#xff01;

靠谱的车【华为OD机试-JAVAPythonC++JS】

题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

Python中操作MySQL和SQL Server数据库的基础与实战【第97篇—MySQL数据库】

Python中操作MySQL和SQL Server数据库的基础与实战 在Python中&#xff0c;我们经常需要与各种数据库进行交互&#xff0c;其中MySQL和SQL Server是两个常见的选择。本文将介绍如何使用pymysql和pymssql库进行基本的数据库操作&#xff0c;并通过实际代码示例来展示这些操作。…