若依实现图片上传时自动添加水印
文章目录
- 总体思路
- 1. 修改通用上传方法
- 2. 去除文件路径前两级目录
- 3. 添加水印方法
- 运行效果
- 总结
为了解决图盗用,并有效保护图片版权,若依项目需要实现一个功能:上传图片时,自动在图片上添加水印。这不仅可以有效防止盗用,还能提高内容的安全性。本文将详细介绍如何在若依项目中实现图片上传时自动添加水印的功能。
总体思路
- 修改通用上传方法:在现有的上传图片功能中,添加步骤,将上传的图片添加水印。
- 处理文件路径:去除上传文件路径中的前两级目录,确保文件存储路径一致。
- 添加水印功能:使用 Graphics2D 绘制水印,并保存修改后的图片。
1. 修改通用上传方法
在 CommonController.java 中,我们需要修改文件上传逻辑。通过将上传的图片路径传递到水印添加方法,并返回水印处理后的图片 URL。
/*** 上传文件并添加水印(单个文件)*/
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception {try {// 获取文件上传路径String filePath = RuoYiConfig.getUploadPath();// 上传文件,并返回新文件名String fileName = FileUploadUtils.upload(filePath, file);// 去除文件路径的前两级目录String updatedFilePath = removePath(fileName);// 添加水印到图片String watermarkFilePath = addWatermark(filePath + updatedFilePath);// 构建访问上传后文件的URLString url = serverConfig.getUrl() + watermarkFilePath;// 返回响应结果AjaxResult ajax = AjaxResult.success();ajax.put("url", url);ajax.put("fileName", fileName);ajax.put("newFileName", FileUtils.getName(fileName));ajax.put("originalFilename", file.getOriginalFilename());return ajax;} catch (Exception e) {return AjaxResult.error("上传失败: " + e.getMessage());}
}
2. 去除文件路径前两级目录
为了确保上传的文件路径没有多余的目录,我们需要创建一个方法来去除路径的前两级目录。
/*** 去除文件路径的前两级目录*/
private String removePath(String filePath) {int count = 0;int index = -1;// 查找第三个斜杠位置for (int i = 0; i < filePath.length(); i++) {if (filePath.charAt(i) == '/') {count++;if (count == 3) {index = i;break;}}}// 返回第三个斜杠之后的路径部分if (index != -1) {return filePath.substring(index);}return filePath;
}
3. 添加水印方法
接下来,我们实现添加水印的功能。在 Graphics2D 类中,我们可以绘制文本水印。以下是如何在图片上添加水印的代码:
/*** 给图片添加水印*/
private String addWatermark(String filePath) throws IOException {// 读取图片文件BufferedImage image = ImageIO.read(new File(filePath));// 创建Graphics2D对象,设置水印的字体和样式Graphics2D g2d = (Graphics2D) image.getGraphics();Font font = new Font("宋体", Font.BOLD, 30); // 设置字体、样式和大小g2d.setFont(font);g2d.setColor(new Color(255, 0, 0, 100)); // 红色透明水印// 水印内容String watermarkText = "测试水印";// 水印位置:右下角int x = image.getWidth() - g2d.getFontMetrics().stringWidth(watermarkText) - 10;int y = image.getHeight() - 10;// 绘制水印g2d.drawString(watermarkText, x, y);// 保存水印处理后的图片,覆盖原文件File output = new File(filePath);ImageIO.write(image, "jpg", output);// 释放Graphics2D资源g2d.dispose();return filePath;
}
运行效果
一旦集成了水印添加功能,当用户上传图片时,系统将自动在图片的右下角添加水印。以下是上传并添加水印后的效果示例:

上传成功后,返回带水印的图片 URL,用户可以通过该 URL 访问带有水印的图片。
总结
通过以上步骤,我们成功地为若依项目实现了图片上传时自动添加水印的功能。这不仅保护了图片的版权,还增强了图片内容的安全性。通过 Graphics2D 类的绘图功能,我们可以灵活地在图片上添加自定义水印,进一步提升了项目的功能性和用户体验。
相关文章:
若依实现图片上传时自动添加水印
文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用,并有效保护图片版权,若依项目需要实现一个功能:上传图片时,自动在图片上添加水印。这不仅可以有效防止盗用ÿ…...
用于日语词汇学习的微信小程序+ssm
日语词汇学习小程序是高校人才培养计划的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式,所以有必要开发日语词汇…...
【信息系统项目管理师】高分论文:论信息系统项目的范围管理(融媒体发布系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围正文 我市xx社区作为智慧社区建设的试点社区,将通过各种创新技术手段,促进小区公共服务智能管理应用,实现社区中的基础设施、环…...
Kaggler日志--Day5
进度24/12/15 昨日复盘 Intermediate Mechine Learning之类型变量 读两篇讲解如何提问的文章,在提问区里发起一次提问 实战:自己从头到尾首先Housing Prices Competition for Kaggle Learn Users并成功提交 Intermediate Mechine Learning之管道&#…...
VScode MAC按任意键关闭终端 想要访问桌面文件
说明 最近配置MAC上CPP的运行环境,在安装必要的CPP插件后,配置launch和task等json文件后,点击运行三角形,每次都会跳出main想要访问桌面上的文件。并且输出也是在调试控制台,非常逆天。 尝试 尝试1:尽管我尝试将ta…...
小粑记故乡的记忆
小粑,是我的故乡一安徽池州一带盛行的小吃。约成人掌心大小,厚度只三、四厘米,故谓之“小”。 小粑,主打取材随性,方便常做常吃。这也许就是它抓住人的味蕾,渐次流行开来,成为当地名小吃的主要原…...
git使用小记
环境(centos为例): yum -y install gitmkdir git_dir && cd git_dirgit clone *** 修改代码: git checkout master 切到主分支git pull 拉取最新代码git branch dev 创建开发分支git checkout dev 切换到开发分支修…...
Python实现办公自动化——自动编写word文档
Python实现办公自动化——自动编写word文档 前言安装python-docxpython-docx使用创建word文档设置纸张方向、大小和页边距统一设置格式插入文本插入表格插入图片 结语 前言 工作中有大量的报告编写需求,在不停地复制粘贴之后,突然想到,这种高…...
番外篇 | BGF-YOLO:引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8检测性能
前言:Hello大家好,我是小哥谈。本文提出了一种名为BGF-YOLO的新模型,通过引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8在脑肿瘤检测中的性能,采用多层特征融合与动态稀疏注意机制以减少特征冗余。 🌈 目录 🚀1.基础概念 🚀2.网络结构 �…...
Python运维自动化之字典Dict
字典Dict(哈希表) Dict即Dictionary,也称为mapping。 Python中,字典由任意个元素构成的集合,每一个元素称为Item,也称为Entry。这个Item是由(key, value)组成的二元组。 字典是可变的、无序的、key不重复的key-value键值对集合。…...
axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示
接之前的博客设计从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三),目前已经完成了基本的功能demo,但是请求接口不可能每个页…...
9.Python 条件语句和循环语句
文章目录 Python 条件语句和循环语句1. **条件语句 (Conditional Statements)**1.1 if 语句1.2 if-else 语句1.3 if-elif-else 语句 2. **循环语句 (Loop Statements)**2.1 while 循环2.2 for 循环2.3 循环嵌套 (Nested Loops) 3. **控制循环的语句**3.1 break 语句3.2 continu…...
智能家居控制系统设计
设计智能家居控制系统是一个复杂但有趣的项目,它涉及硬件与软件的集成、网络通信、用户界面设计等多个方面。以下是一个智能家居控制系统的基本设计思路: 1. 需求分析- 功能需求:明确系统需要实现的功能,如灯光控制、空调温度调节…...
Windows系统word插入公式自动编号并交叉引用
一、定义新的多级列表 鼠标单击页面空白处 二、插入域 鼠标单击要插入公式编号的地方 三、交叉引用 鼠标单击要引用公式编号的地方 四、更新编号(域) CtrlA:全选全文 鼠标右键:更新域...
0.基础语法
文章目录 1. 第一个 Python 程序2. Python2.x 和 Python3.x 的差异3. 标识符和保留字符4. 行和缩进5. 多行语句6. 引号7. 注释8. 空行9. 用户输入10. Print 输出11. 代码组12. 命令行参数 Python 基础语法涵盖了从安装和运行 Python 程序到理解语言核心概念的各个方面。以下是基…...
mysql命令行界面(黑框)的登录
文章目录 开启关闭服务报错登录mysql退出mysql数据据database在电脑中的存放位置删除数据库语句 drop注意 cmd用管理员打开 开启关闭服务 报错 我有这个报错,但是使用没什么影响 登录mysql root替换成自己的用户名 退出mysql exit 数据据database在电脑中的…...
【机器学习】解构概率,重构世界:贝叶斯定理与智能世界的暗语
文章目录 条件概率与贝叶斯定理:深入理解机器学习中的概率关系前言一、条件概率与贝叶斯定理1.1 条件概率的定义与公式1.1.1 条件概率的定义1.1.2 条件概率的实例讲解 1.2 条件概率的性质与法则1.2.1 链式法则1.2.2 全概率公式1.2.3 贝叶斯定理的推导 1.3 贝叶斯定理…...
threejs——无人机概念切割效果
主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…...
electron学习笔记(一)
1.创建项目 mkdir myelectron npm init npm install --save-dev electron //安装通过以上命令, 我们就有了一个 electron 的项目 之后, 设置主文件入口 , 添加热启动 nodemon 2. nodemon 的使用和配置 要根目录下添加 nodemon.json 文件,配…...
基于Arduino蹲便器的自动清洁系统(论文+源码)
1系统整体设计 经过上述的方案分析,最终确定了Arduino UNO开发板为核心,结合蓝牙模块,舵机,电磁阀,红外传感器,步进电机,舵机等硬件设备来构成整个控制系统,整体框图如图2.1所示。其…...
新手福音:通过快马AI生成openclaw安卓自动化入门项目,零基础跑通第一个脚本
新手福音:通过快马AI生成openclaw安卓自动化入门项目,零基础跑通第一个脚本 作为一个刚接触安卓自动化测试的新手,我最近在尝试使用openclaw进行安卓设备操作时遇到了不少困难。从环境配置到脚本编写,每一步都可能踩坑。好在发现…...
突破JSXBIN加密限制:Jsxer高效解码解决方案
突破JSXBIN加密限制:Jsxer高效解码解决方案 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer 当创意设计师和开发人员面对Adobe ExtendScript的JSXBIN二进制文件时,往往陷入代…...
Flowable建模器汉化实战:如何用SecurityUtils绕过官方认证实现本地化部署
Flowable建模器深度汉化与本地化部署实战指南 当企业级工作流系统需要深度定制时,Flowable建模器的原生界面往往成为用户体验的瓶颈。本文将揭示一套完整的解决方案,从界面元素汉化到认证体系重构,最终实现开箱即用的中文建模环境。 1. 汉化…...
突破网盘下载瓶颈:开源工具如何重塑你的文件获取体验
突破网盘下载瓶颈:开源工具如何重塑你的文件获取体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...
戴尔G15终极散热控制指南:告别AWCC臃肿,拥抱轻量级开源方案
戴尔G15终极散热控制指南:告别AWCC臃肿,拥抱轻量级开源方案 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为戴尔G15笔记本的高温…...
ArduinoUZlib:嵌入式GZIP流解压轻量实现
1. ArduinoUZlib 库深度解析:面向嵌入式系统的轻量级 GZIP 流解压缩实现1.1 工程背景与设计定位在资源受限的嵌入式系统中,HTTP 响应体、固件更新包、配置文件或传感器日志常以 GZIP 格式传输以节省带宽与 Flash 空间。然而,标准 zlib 实现&a…...
Leather Dress Collection 网络协议分析与API接口设计规范
Leather Dress Collection 网络协议分析与API接口设计规范 最近在内部项目里,我们接入了好几个类似Leather Dress Collection这样的AI模型服务。一开始大家调用得挺开心,但用着用着问题就来了:有的服务突然响应变慢,有的接口偶尔…...
7个核心价值点:Python学习路径与实战案例深度解析
7个核心价值点:Python学习路径与实战案例深度解析 【免费下载链接】Python-100-Days Python - 100天从新手到大师 项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days Python作为一门多用途编程语言,在数据分析、Web开发、人工智…...
专业解决方案:Windows 11 LTSC系统一键安装微软商店完整指南
专业解决方案:Windows 11 LTSC系统一键安装微软商店完整指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC系统以其卓越…...
AI专著撰写大揭秘:实用工具深度解读,轻松打造学术佳作
撰写学术专著不仅考验研究者的学术能力,同样是对心理承受力的挑战。与可以通过团队合作完成的论文写作不同,专著的创作通常是“独自一人”的过程。从选定主题、搭建框架到具体的内容撰写和修改,每一个环节几乎都需要研究者亲自完成。长期处于…...
