图片的处理库Thumbnailator

news/发布时间2024/9/20 9:00:59

摘要:最近遇到图片处理的问题,借助了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.bcls.cn/pMBP/10126.shtml

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

相关文章

ChatGPT/GPT4科研应用与AI绘图及论文高效写作

原文&#xff1a;ChatGPT/GPT4科研应用与AI绘图及论文高效写作 第一&#xff1a;2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-4 第二&#xff1a;…

【一】【算法分析与设计】基础测试

排列式 题目描述 7254是一个不寻常的数&#xff0c;因为它可以表示为7254 39 x 186&#xff0c;这个式子中1~9每个数字正好出现一次 输出所有这样的不同的式子&#xff08;乘数交换被认为是相同的式子&#xff09; 结果小的先输出&#xff1b;结果相同的&#xff0c;较小的乘…

VR全景HDR拍摄教程

什么是HDR&#xff1f; HDR可以用在哪里&#xff1f; 书面解释&#xff1a;HDR&#xff08;高动态范围 High Dynamic Range&#xff09;摄影&#xff0c;是摄影领域广泛使用的一种技术。 是不是有点懵&#xff1f; 我们来看一个实际的拍摄现场环境&#xff0c;你就懂了 我们…

浅谈消防设备电源监控系统在某卷烟厂中的应用

彭姝麟 Acrelpsl 1、工程概况 某卷烟厂进行异地技术升级改造&#xff0c;规划新建厂区占地约 120 000m 2 &#xff0c;新建联合生产工房 49 000m 2 &#xff0c;动力中心 7 500m 2 &#xff0c;香精香料库 720m 2 &#xff0c;片烟醇化库22 500m 2 &#xff0c;生产指挥中心7 …

mount命令最新详细教程

背景 需要在设备上面&#xff0c;自动化运行u盘里面的脚本&#xff0c;并且进入一个产测模式。因此实际使用了这个mount命令&#xff0c;所以&#xff0c;写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统&#xff0c;即将存储设备…

linux+fortify

系统版本&#xff1a;Ubuntu22.04桌面版 一&#xff1a;登录root用户关闭防火墙 sudo passwd root systemctl stop ufw.service systemctl disable ufw.service 二&#xff1a;开启ssh服务 sudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo …

vue-router4 (六) 路由嵌套

应用场景&#xff1a; ①比如京东页面的首页、购物车、我的按钮&#xff0c;可以点击切换到对应的页面&#xff1b; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面&#xff0c;此时可以把左侧按钮放在父路由中&#xff0c;右侧的子路由 1.路由配置&#xff0c;子路由…

day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)

文章目录 1 菜单管理1.1 表结构介绍1.2 查询菜单1.2.1 需求说明1.2.2 页面制作1.2.3 后端接口SysMenuSysMenuControllerSysMenuServiceMenuHelperSysMenuMapperSysMenuMapper.xml 1.2.4 前端对接sysMenu.jssysMenu.vue 1.3 添加菜单1.3.1 需求说明1.3.3 页面制作1.3.3 后端接口…

使用 MongoDB Atlas 无服务器实例更高效地开发应用程序

使用 MongoDB Atlas无服务器实例更高效地开发应用程序 身为开发者&#xff0c;数据库并不一定需要您来操心。您可不想耗费时间来预配置集群或调整集群大小。同样地&#xff0c;您也不想操心因未能正确扩展而导致经费超标。 MongoDB Atlas 可为您提供多个数据库部署选项。虽然…

【刷题】位运算

消失的两个数字 消失的两个数字 “单身狗”进阶版思路 class Solution { public:vector<int> missingTwo(vector<int>& nums) {int ret 0;int n nums.size();for(int i 0; i < n; i){ret ^ (nums[i] ^ i);}ret ^ (n ^ (n 1) ^ (n 2));// 按位异或的…

比Windows 还要早称霸全球的操作系统

走进历史的尘埃&#xff0c;比Windows 还要早称霸全球的操作系统&#xff0c;你还记得吗&#xff1f; 当我们回首家用电脑的辉煌历程&#xff0c;不禁会想起那个曾经统治全球操作系统市场的巨无霸——DOS&#xff08;Disk Operating System&#xff09;。在1995年Windows 95横…

C++多线程学习09:并发队列

参考 链接&#xff1a;恋恋风辰官方博客 并发队列&线程安全栈 代码结构&#xff1a; 并发队列ThreadSafeQueue.h&#xff1a; #pragma once#include <mutex> #include <queue>template<typename T> class threadsafe_queue { private:mutable std::m…

leetcode刷题(javaScript)——栈相关场景题总结

在LeetCode刷题中&#xff0c;栈是一个非常有用的数据结构&#xff0c;可以解决许多问题&#xff0c;包括但不限于以下几类问题&#xff1a; 括号匹配问题&#xff1a;例如检查括号序列是否有效、计算表达式的值等。逆波兰表达式求值&#xff1a;使用栈来实现逆波兰表达式的计算…

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

Ainx的全局配置

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

mysql,for循环执行sql

遇到一个问题&#xff0c;我需要模拟上百万数据来优化sql&#xff0c;线上数据down不下来&#xff0c;测试库又没有&#xff0c;写代码执行要么慢要么就是sql语句太长。 于是&#xff0c;直接用mysql自带的功能去实现&#xff01; 简单而简单 mysql可以for循环&#xff1f;没…

Docker 第十九章 : 阿里云个人镜像仓使用

Docker 第十九章 : 阿里云个人镜像仓使用 本章知识点: 如何创建镜像库,如何设置密码,如何登录与退出个人镜像仓,如何本地打镜像,如何将本地镜像推送到个人镜像库。 背景 在项目YapiDocker部署中,因读取mongo:latest 版本不一致,导致后续执行步骤的异常。遇到此场景…

Python中网络请求超时的原因及解决方案

在进行网络数据爬取过程中&#xff0c;网络请求超时是一个令人头疼的问题。尤其在Python中&#xff0c;我们常常需要应对各种网络爬虫、API调用或其他网络操作&#xff0c;而网络请求超时的原因千奇百怪。在本篇文章中&#xff0c;我们将深入了解网络请求超时的可能原因&#x…

MATLAB环境下基于局部高斯分布拟合能量的图像分割方法

局部高斯分布拟合能量模型利用局部图像灰度均值和方差信息构造能量泛函&#xff0c;能量泛函由局部图像轮廓内外的高斯分布拟合项和正则项构成&#xff0c;拟合项驱使演化曲线向目标轮廓演化&#xff0c;正则项保持演化曲线的光滑度和避免重新初始化水平集函数。局部高斯分布拟…

拦截器Interceptor(黑马学习笔记)

学习完了过滤器Filter之后&#xff0c;接下来我们继续学习拦截器Interceptor。 拦截器我们主要分为三个方面进行讲解&#xff1a; 1.介绍下什么是拦截器&#xff0c;并通过快速入门程序上手拦截器 2.拦截器的使用细节 3.通过拦截器Interceptor完成登录校验功能 我们先学习第一…
推荐文章