当前位置: 首页 > article >正文

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现:


方法一:使用 CSS

直接通过 CSS 的 background 属性实现水印:

实现步骤
  1. 在需要添加水印的容器中设置背景。
  2. 使用 rgba 设置透明度,并通过 background-repeatbackground-size 实现重复。
示例代码
<template>
  <div class="watermark-container">
    <p>这是带水印的内容。</p>
  </div>
</template>

<style>
.watermark-container {
  position: relative;
  width: 100%;
  height: 200px;
  background-color: #f0f0f0;
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><text x="20" y="100" font-size="20" fill="rgba(0,0,0,0.2)" transform="rotate(-45)">Watermark</text></svg>');
  background-repeat: repeat;
}
</style>

方法二:通过 Canvas 动态生成水印

使用 Canvas 动态生成水印,并将其作为背景图应用。

实现步骤
  1. 在 Vue 中创建一个方法,通过 canvas 动态生成水印图。
  2. 将生成的图像作为背景图应用到需要添加水印的元素上。
示例代码
<template>
  <div class="watermark-container" :style="{ backgroundImage: watermark }">
    <p>这是带水印的内容。</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      watermark: '',
    };
  },
  mounted() {
    this.generateWatermark();
  },
  methods: {
    generateWatermark() {
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');

      canvas.width = 200;
      canvas.height = 200;

      ctx.font = '20px Arial';
      ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      ctx.translate(100, 100);
      ctx.rotate((-45 * Math.PI) / 180);
      ctx.fillText('Watermark', 0, 0);

      this.watermark = `url(${canvas.toDataURL('image/png')})`;
    },
  },
};
</script>

<style>
.watermark-container {
  position: relative;
  width: 100%;
  height: 200px;
  background-repeat: repeat;
}
</style>

方法三:封装水印组件

如果需要复用,可以封装一个通用的水印组件。

示例代码
<template>
  <div class="watermark" :style="{ backgroundImage: watermark }">
    <slot></slot>
  </div>
</template>

<script>
export default {
  props: {
    text: {
      type: String,
      default: 'Watermark',
    },
    fontSize: {
      type: String,
      default: '20px',
    },
    color: {
      type: String,
      default: 'rgba(0, 0, 0, 0.2)',
    },
    rotate: {
      type: Number,
      default: -45,
    },
  },
  data() {
    return {
      watermark: '',
    };
  },
  mounted() {
    this.generateWatermark();
  },
  methods: {
    generateWatermark() {
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');

      canvas.width = 200;
      canvas.height = 200;

      ctx.font = `${this.fontSize} Arial`;
      ctx.fillStyle = this.color;
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      ctx.translate(100, 100);
      ctx.rotate((this.rotate * Math.PI) / 180);
      ctx.fillText(this.text, 0, 0);

      this.watermark = `url(${canvas.toDataURL('image/png')})`;
    },
  },
};
</script>

<style>
.watermark {
  position: relative;
  width: 100%;
  height: 100%;
  background-repeat: repeat;
}
</style>

使用:

<template>
  <div>
    <Watermark text="Confidential" color="rgba(255,0,0,0.1)">
      <p>这是机密内容。</p>
    </Watermark>
  </div>
</template>

<script>
import Watermark from './Watermark.vue';

export default {
  components: {
    Watermark,
  },
};
</script>

在这里插入图片描述

以上方法可以根据需求选择适合的方式实现水印效果。


http://www.kler.cn/a/421006.html

相关文章:

  • JavaScript中的 closest 方法详解
  • 【Linux】常用命令二
  • jmeter 压测常用静默参数解释应用
  • 机器学习概述,特征工程简述2.1——2.3
  • delphi 12 idhttpsever(S)+idhttp(C) 实现简单的JSON API服务
  • 算法日记 40 day 单调栈
  • 2-2-18-9 QNX系统架构之文件系统(二)
  • 智能Java开发工具IntelliJ IDEA v2024.3正式推出——拥有全新开发体验!
  • Linux详解:文件权限
  • Excel中日期格式“年月日 时间”修改为“年月日”
  • 2022 年 12 月青少年软编等考 C 语言三级真题解析
  • K8S的监控与告警配置有哪些最佳实践
  • 2.STM32通信接口之SPI通信---SPI实战《精讲》
  • 问:介绍一下WebSocket原理和用法?
  • LabVIEW氢气纯化控制系统
  • 基于STM32的智能工业温度监测与控制系统设计
  • 【第 1 章 初识 C 语言】1.7 编程语言的分类:编译型语言与解释型语言
  • 【软考速通笔记】系统架构设计师⑯——通信系统架构设计
  • Vue Web开发遇到问题汇总
  • 掌握 Spring Boot 中的缓存:技术和最佳实践
  • 设计模式-适配器模式-注册器模式
  • 用函数实现模块化程序设计(七)--数组作为函数参数(排序算法)
  • 【Elasticsearch】06-JavaRestClient查询
  • springboot340“共享书角”图书借还管理系统(论文+源码)_kaic
  • YOLOv11融合[ECCV2024]WTConvNeXt中的WTConv模块及相关改进思路
  • 利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题