开发喵星球

若依上传图片添加水印(258)

需求提出

在若依项目中实现上传图片时自动添加水印功能,以保护图片版权和防止盗用。

相关介绍

Graphics2DJava 中用于绘图的高级图形类,属于 java.awt 包。它是 Graphics 类的子类,提供了更丰富的绘图功能和更高的灵活性。Graphics2D 可以用于绘制形状、文本和图像,并支持高级图形操作如变换、剪切、和抗锯齿等。

解决思路

  1. 修改通用上传方法,上传图片后添加水印。
  2. 实现去除文件路径前两级目录的方法。
  3. 实现添加水印的方法。

所需技术

项目结构树

ruoyi
├── ruoyi-admin
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── ruoyi
│   │   │   │           └── web
│   │   │   │               └── controller
│   │   │   │                   └── common
│   │   │   │                       └── CommonController.java
│   │   │   └── resources
│   │   └── test
├── ruoyi-framework
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   └── resources
│       └── test
└── pom.xml

注意事项

  1. 确保图片上传路径正确。
  2. 水印文字和样式可以根据实际需求进行调整。
  3. 添加水印的方法需处理不同类型的图片格式。

完整代码

第一步:修改通用上传方法

ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java文件中,修改上传文件的方法:

/**
 * 通用上传请求(单个)
 */
@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());
    }
}

第二步:去除文件路径前两级目录方法

CommonController.java文件中添加去除文件路径前两级目录的方法:

/**
 * 去除文件路径的前两级目录
 */
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;
}

第三步:添加水印方法

CommonController.java文件中添加给图片文件添加水印的方法:

/**
 * 给图片文件添加水印
 */
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, 20);
    g2d.setFont(font);
    g2d.setColor(Color.BLACK);

    // 在右下角添加水印
    String watermark = "kaifamiao专属水印";
    int x = image.getWidth() - g2d.getFontMetrics().stringWidth(watermark) - 10;
    int y = image.getHeight() - 10;
    g2d.drawString(watermark, x, y);

    // 保存添加水印后的图片,覆盖原始图片
    File output = new File(filePath);
    ImageIO.write(image, "jpg", output);
    g2d.dispose();
    return filePath;
}

运行结果


上传图片时,系统自动在图片右下角添加水印文字“kaifamiao专属水印”。上传成功后,返回包含水印的图片的URL,用户可以通过该URL访问带有水印的图片。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-07-04 02:23:56 阅读量:167
<<   >>


powered by kaifamiao