使用canvas为项目添加水印

99 阅读2分钟

**话不多说,直接进入正题。**

**如果对你有帮助,记得点赞收藏加关注。**

预览效果:

image.png

1.第一步创建文件夹

如下图:

微信图片_20231219134849.png

2.waterMark.js

/**
 * 自定义指令'v-watermark'
 * 可以传入自定义参数(v-watermark="markObj"),参数(markObj)格式为
 * {
 *      text: '水印内容',  // 水印文字内容
 *      angle: 25,  // 水印倾斜度
 *      color: 'rgba(0,0,0,.15)',  // 水印文字颜色
 *      fontSize: '16px',  //   水印文字大小
 *      top: 70  // 水印区域距离浏览器可视区域顶部的距离,单位px
 * }
 * 参数是可选的,不传的时候可以直接使用 v-watermark 指令即可
 */

// 记录上一次生成水印的 div 元素 id
let prevDivId = 0

const number180 = 180

// 生成水印
const setWatermark = (markObj) => {
  // 默认设置
  const defaultObj = {
    text: '水印内容',
    angle: 30,
    color: 'rgba(180, 180, 180, 0.3)',
    fontSize: '16px',
    top: 0
  }
  defaultObj.text =
    markObj.userName +
    '-' +
    markObj.userId +
    '-' +
    new Date().toLocaleDateString()
  // 角度转成负数
  defaultObj.angle = -Math.abs(defaultObj.angle)
  // 随机生成一个 id
  const id = Math.random()
  // 清除上次的水印 div[解决:窗口大小调整时(onresize方法)水印会叠加,导致颜色加深的问题]
  if (prevDivId && document.getElementById(prevDivId) !== null) {
    document.body.removeChild(document.getElementById(prevDivId))
  }
  // 记录 id
  prevDivId = id

  // 创建画布
  const canvas = document.createElement('canvas')
  // 设置画布的长、宽
  canvas.width = 400
  canvas.height = 200

  const context = canvas.getContext('2d')

  // 旋转角度(以弧度计)
  context.rotate((defaultObj.angle * Math.PI) / number180)
  context.font = defaultObj.fontSize + ' 微软雅黑'
  // 设置填充绘画的颜色、渐变或者模式
  context.fillStyle = defaultObj.color
  context.textAlign = 'left'
  context.textBaseline = 'middle'
  context.fillText(defaultObj.text, 0, canvas.height)

  const div = document.createElement('div')
  div.id = prevDivId
  div.style.pointerEvents = 'none'
  div.style.position = 'absolute'
  div.style.top = defaultObj.top + 'px'
  div.style.left = '0px'
  div.style.zIndex = '9999'
  div.style.width = document.documentElement.scrollWidth + 'px'
  div.style.height = document.documentElement.scrollHeight + 'px'
  div.style.background =
    'url(' + canvas.toDataURL('image/png') + ') left top repeat'
  document.body.appendChild(div)
  return prevDivId
}
export default {
  mounted(el, binding) {
    const { value } = binding
    if (value.userId) {
      setWatermark(value || {})
      // 监听窗口变化事件
      window.onresize = () => {
        if (prevDivId !== 0) {
          setWatermark(value || {})
        }
      }
      // 监听页面滚动
      window.onscroll = () => {
        if (prevDivId !== 0) {
          setWatermark(value || {})
        }
      }
    }
  }
}

3.index.js

//创建自定义指令
import waterMark from './common/waterMark'
export default function directive(app) {
  app.directive('waterMark', waterMark)
}

4.在main.js中引入并使用

import directive from './directive'
directive(app)

5.在组件中通过 v-waterMark="变量名称"使用

image.png

6.码云项目地址:gitee.com/togoxl/blog…

7.至此结束,快去你的项目试试吧