若依实现图片上传时自动添加水印

news2024/12/15 21:14:06

文章目录

  • 总体思路
  • 1. 修改通用上传方法
  • 2. 去除文件路径前两级目录
  • 3. 添加水印方法
  • 运行效果
  • 总结

为了解决图盗用,并有效保护图片版权,若依项目需要实现一个功能:上传图片时,自动在图片上添加水印。这不仅可以有效防止盗用,还能提高内容的安全性。本文将详细介绍如何在若依项目中实现图片上传时自动添加水印的功能。

总体思路

  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);

        // 构建访问上传后文件的URL
        String 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 类的绘图功能,我们可以灵活地在图片上添加自定义水印,进一步提升了项目的功能性和用户体验。

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

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

相关文章

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道&#xff1f; 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时&#xff0c;命名管道&#xff08;Named Pipes…

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号&#xff08;我的显示的是12&#xff09;—>最下方Size处设置字号大小—>Select—>设置完…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用&#xff1f; K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现&#xff0c;它可以提高 IDE 的稳定性&#xff0c;同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别&#xff1f; K2 编译器负责编译 Kotlin 语言 2.0 或…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面&#xff0c;一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期&#xff01;12 月 15 日&#xff08;周日&#xff09;上午&…

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具&#xff0c;广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置&#xff0c;以高效监控服务&#xff0c;并确保系统的可靠性和可维护性。 一、Prometheus 简介 Prometheus 是一个功能…

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来&#xff0c;随着城市化进程的…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…

KMP 字符串匹配详解

一、KMP 的作用 KMP 用于解决字符串匹配问题&#xff0c;当出现字符串不匹配时&#xff0c;可以知道一部分之前已经匹配的文本内容&#xff0c;可以利用这些信息避免从头再去做匹配了。 二、题目 链接&#xff1a;28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;Lee…

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack &#xff08;1&#xff09;简介 官网地址&#xff1a;https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际…

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用&#xff0c;而不能在服务器组件中使用。Next.js 的新架构&#xff08;App Router&#xff09;中&#xff0c;默认情况下&#xff0c;页面和布局组件是服务器组件&#xff0c;因此不能直接使…

MySQL相关文件

配置文件 — — — — — — /etc/my.cnf datadir/var/lib/mysql //数据目录 socket/var/lib/mysql/mysql.sock //定义套接字文件存储位置&#xff0c;套接字文件&#xff08;IP&#xff1a;port&#xff09;,用于接收客户端连…