vue3页面生成水印

本文介绍了一个Vue.js中的自定义hooks,用于在前端页面上添加可配置透明度的水印,同时提供清除功能以防止内存泄漏。开发者可以轻松设置和管理水印,确保数据安全和用户体验。
摘要由CSDN通过智能技术生成

前沿

之前开发需求,产品希望给所有中台页面添加水印,一方面防止内部人员截图泄漏数据,一方面水印上的内容可以增加些标识,从而能定位到是那个人发出的。
当然这只是一种防护的手段,毕竟水印也是能去除的,但不管怎么样,加这么层东西还是感觉十分有必要的,比如你要分享什么设计稿,你打个logo,水印,最起码能起到点防止作用。
好了,我也不多说,直接分享上代码,咱主打的就是复制就能用,丝毫不墨迹。

代码

/*
 * @Author       : 桔子
 * @Date         : 2024-04-07 11:09:15
 * @LastEditors  : 桔子
 * @LastEditTime : 2024-04-29 16:34:25
 * @Description  : 水印hooks
 * @FilePath     : /vue-multipage/hooks/web/useWatermark.ts
 */
const domSymbol = Symbol('watermark-dom')

export function useWatermark(
  op = 0.15,
  appendEl: HTMLElement | null = document.body
) {
  let func: any = () => {}
  const id = domSymbol.toString()
  const clear = () => {
    const domId = document.getElementById(id)
    if (domId) {
      const el = appendEl
      el && el.removeChild(domId)
    }
    window.removeEventListener('resize', func)
  }
  const createWatermark = (str: string) => {
    clear()

    const can = document.createElement('canvas')
    can.width = 300
    can.height = 240

    const cans = can.getContext('2d')
    if (cans) {
      cans.rotate((-20 * Math.PI) / 120)
      cans.font = '15px Vedana'
      cans.fillStyle = `rgba(0, 0, 0, ${op})`
      cans.textAlign = 'left'
      cans.textBaseline = 'middle'
      cans.fillText(str, can.width / 20, can.height)
    }

    const div = document.createElement('div')
    div.id = id
    div.style.pointerEvents = 'none'
    div.style.top = '0px'
    div.style.left = '0px'
    div.style.position = 'absolute'
    div.style.zIndex = '100000000'
    div.style.width = document.documentElement.clientWidth + 'px'
    div.style.height = document.documentElement.clientHeight + 'px'
    div.style.background =
      'url(' + can.toDataURL('image/png') + ') left top repeat'
    const el = appendEl
    el && el.appendChild(div)
    return id
  }

  function setWatermark(str: string) {
    createWatermark(str)
    func = () => {
      createWatermark(str)
    }
    window.addEventListener('resize', func)
  }

  return { setWatermark, clear }
}

使用

import { useWatermark } from '@/hooks/web/useWatermark'

const { setWatermark, clear } = useWatermark(0.2)

onMounted(() => {
  setWatermark('桔子水印')
})

onBeforeUnmount(() => {
  clear()
})

在这里插入图片描述

说明

写了个hooks哈,useWatermark接收两个参数,一个是水印的透明度,可以不传,默认0.15,第二个参数是水印绑定上的dom节点,默认是body,一般也是全局加上,所以这默认body。
这里面其实就是三个方法哈,创建水印,设置水印,清除水印。
如果想修改水印的一些字体信息,可以在createWatermark里面去自行调整,使用起来也很简单,结构出来setWatermark和clear两个方法即可
注意哈,咱们页面销毁就清除掉,以防万一,避免内存泄漏

最后

希望能对各位有用,如果有用到麻烦打赏个赞,感谢🙏

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue页面生成图片并平铺水印,可以使用HTML5的Canvas API。下面是一个简单的示例: 1. 在Vue组件中添加一个Canvas元素: ``` <canvas ref="canvas"></canvas> ``` 2. 在Vue组件的mounted钩子函数中获取Canvas元素的上下文(context),并加载图片: ``` mounted() { // 获取Canvas元素的上下文 const canvas = this.$refs.canvas; const context = canvas.getContext('2d'); // 加载图片 const img = new Image(); img.src = 'path/to/image'; img.onload = () => { // 将图片绘制到Canvas上 context.drawImage(img, 0, 0, canvas.width, canvas.height); // 添加水印 const watermarkImg = new Image(); watermarkImg.src = 'path/to/watermark/image'; watermarkImg.onload = () => { // 计算水印的平铺次数 const repeatX = Math.ceil(canvas.width / watermarkImg.width); const repeatY = Math.ceil(canvas.height / watermarkImg.height); // 平铺水印 for (let i = 0; i < repeatX; i++) { for (let j = 0; j < repeatY; j++) { context.drawImage(watermarkImg, i * watermarkImg.width, j * watermarkImg.height); } } } } } ``` 3. 在Vue组件的template中添加一个按钮,点击按钮时将Canvas保存为图片: ``` <template> <div> <canvas ref="canvas"></canvas> <button @click="saveImage">保存图片</button> </div> </template> <script> export default { methods: { saveImage() { // 将Canvas保存为图片 const canvas = this.$refs.canvas; const dataURL = canvas.toDataURL('image/png'); const link = document.createElement('a'); link.href = dataURL; link.download = 'image.png'; link.click(); } } } </script> ``` 这样就可以在Vue页面生成包含平铺水印的图片,并且可以通过点击按钮将该图片保存到本地。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值