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

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

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

方法一:使用 CSS

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


  • 在需要添加水印的容器中设置背景。
  • 使用 rgba 设置透明度,并通过 background-repeat 和 background-size 实现重复。
示例代码

  1. <template>
  2.   <div class="watermark-container">
  3.     <p>这是带水印的内容。</p>
  4.   </div>
  5. </template>
  6. <style>
  7. .watermark-container {
  8.   position: relative;
  9.   width: 100%;
  10.   height: 200px;
  11.   background-color: #f0f0f0;
  12.   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>');
  13.   background-repeat: repeat;
  14. }
  15. </style>
复制代码

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

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


  • 在 Vue 中创建一个方法,通过 canvas 动态生成水印图。
  • 将生成的图像作为背景图应用到需要添加水印的元素上。
示例代码

  1. <template>
  2.   <div class="watermark-container" :style="{ backgroundImage: watermark }">
  3.     <p>这是带水印的内容。</p>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   data() {
  9.     return {
  10.       watermark: '',
  11.     };
  12.   },
  13.   mounted() {
  14.     this.generateWatermark();
  15.   },
  16.   methods: {
  17.     generateWatermark() {
  18.       const canvas = document.createElement('canvas');
  19.       const ctx = canvas.getContext('2d');
  20.       canvas.width = 200;
  21.       canvas.height = 200;
  22.       ctx.font = '20px Arial';
  23.       ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
  24.       ctx.textAlign = 'center';
  25.       ctx.textBaseline = 'middle';
  26.       ctx.translate(100, 100);
  27.       ctx.rotate((-45 * Math.PI) / 180);
  28.       ctx.fillText('Watermark', 0, 0);
  29.       this.watermark = `url(${canvas.toDataURL('image/png')})`;
  30.     },
  31.   },
  32. };
  33. </script>
  34. <style>
  35. .watermark-container {
  36.   position: relative;
  37.   width: 100%;
  38.   height: 200px;
  39.   background-repeat: repeat;
  40. }
  41. </style>
复制代码

方法三:封装水印组件

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

  1. <template>
  2.   <div class="watermark" :style="{ backgroundImage: watermark }">
  3.     <slot></slot>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   props: {
  9.     text: {
  10.       type: String,
  11.       default: 'Watermark',
  12.     },
  13.     fontSize: {
  14.       type: String,
  15.       default: '20px',
  16.     },
  17.     color: {
  18.       type: String,
  19.       default: 'rgba(0, 0, 0, 0.2)',
  20.     },
  21.     rotate: {
  22.       type: Number,
  23.       default: -45,
  24.     },
  25.   },
  26.   data() {
  27.     return {
  28.       watermark: '',
  29.     };
  30.   },
  31.   mounted() {
  32.     this.generateWatermark();
  33.   },
  34.   methods: {
  35.     generateWatermark() {
  36.       const canvas = document.createElement('canvas');
  37.       const ctx = canvas.getContext('2d');
  38.       canvas.width = 200;
  39.       canvas.height = 200;
  40.       ctx.font = `${this.fontSize} Arial`;
  41.       ctx.fillStyle = this.color;
  42.       ctx.textAlign = 'center';
  43.       ctx.textBaseline = 'middle';
  44.       ctx.translate(100, 100);
  45.       ctx.rotate((this.rotate * Math.PI) / 180);
  46.       ctx.fillText(this.text, 0, 0);
  47.       this.watermark = `url(${canvas.toDataURL('image/png')})`;
  48.     },
  49.   },
  50. };
  51. </script>
  52. <style>
  53. .watermark {
  54.   position: relative;
  55.   width: 100%;
  56.   height: 100%;
  57.   background-repeat: repeat;
  58. }
  59. </style>
复制代码
使用:
  1. <template>
  2.   <div>
  3.     <Watermark text="Confidential" color="rgba(255,0,0,0.1)">
  4.       <p>这是机密内容。</p>
  5.     </Watermark>
  6.   </div>
  7. </template>
  8. <script>
  9. import Watermark from './Watermark.vue';
  10. export default {
  11.   components: {
  12.     Watermark,
  13.   },
  14. };
  15. </script>
复制代码


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表