首页 > 其他分享 >canvas实现添加水印

canvas实现添加水印

时间:2023-10-31 21:55:16浏览次数:25  
标签:body canvasDom canvas observer newTime ctx 水印 添加 let

canvas添加水印思路

1.在画布上写上水印的名称(时间加上用户名)
2.canvas转化为base64,作为body的背景色
3.优化倾斜度和透明度
4.如果用户去除body的style水印消失
5.鸡肋 MutationObserver

在画布上写上水印的名称

<body>
  <canvas id="canvasDom" ></canvas>
  <script>
    // 获取当前时间
    function curentTime(userName='张三'){
      let newTime = new Date();
      // 获取年
      let newYarn = newTime.getFullYear()
      // 获取月
      let newMonth = (newTime.getMonth() + 1) > 9 ? ( newTime.getMonth() + 1) : "0" + ( newTime.getMonth() + 1);
      // 获取时间
      let newDay = newTime.getDate() > 9 ? newTime.getDate() : "0"+date.getDate(); 
      return newYarn + '-' + newMonth +' -' + newDay + '-'+ userName
    }
    // 获取dom节点
    let canvasDom=document.getElementById('canvasDom')
    // 设置canvas的大小
    canvasDom.width=800
    canvasDom.height=460
    // 获取canvs上下文
    const ctx= canvasDom.getContext('2d')
    //设置文字的大小 以及字体样式
    ctx.font = "30px Verdana"
    // 填充文字以及位置
    ctx.fillText(curentTime(), 100,100)
  </script>
</body>

1.png

canvas转化为base64,作为body的背景色

我们使用 toDataURL('image/png')将画布转为base64.
然后在在将它作为背景色设置在body上。
这样我们就实现了水印的添加
// 获取dom节点
let canvasDom=document.getElementById('canvasDom')
// 设置canvas的大小
canvasDom.width=800
canvasDom.height=460
// canvas重叠部分隐藏
canvasDom.style.display='none'
// 获取canvs上下文
const ctx= canvasDom.getContext('2d')
//设置文字的大小 以及字体样式
ctx.font = "30px Verdana"
// 填充文字以及位置
ctx.fillText(curentTime(), 30,210)
// 将它转化为base64
const img=canvasDom.toDataURL('image/png')
console.log('img', img)
let body = document.getElementById('body')
body.setAttribute('style',`background-image:url("${img}")`)

02.png

优化倾斜度和透明度

// 设置透明度
ctx.fillStyle = 'rgba(0,0,0,.3)'
// 设置倾斜度
ctx.rotate(0.2)
// 填充文字以及位置
ctx.fillText(curentTime(), 30,150)
需要注意的是:透明度和清晰度要在文字填充之前设置。
否者就不会生效。
这个也很好理解,因为有先后顺序。

03.png

出现了一点小的意外

如果别人知道了我们的原理。
就只需要通过控制台取消掉body的style就行。
也就是说:咋们这个方法可能是白做了。
难受,啊!
如果不能取消或者可以监听就好了。

04.png

鸡肋辅助 MutationObserver 登场

如果有一个方法可以监听DOM树属性发生变化就好了。
如果发生了变化。我在重新调用一次就可以解决。
其实还真的存在这样一个API。
他就是MutationObserver。
MutationObserver给我们提供DOM树属性在某个范围内发生变化时作出一定的反应。

MutationObserver的基本用法就是:

// Firefox和Chrome早期版本中带有前缀进行兼容
var MutationObserver = window.MutationObserver || 
  window.WebKitMutationObserver ||
  window.MozMutationObserver

// 选择目标节点
var target = document.getElementById('domID');

// 回调函数
function callBack(){
  console.log('dom树发生变化我会被触发')
}

// 第一步: 创建观察者对象 
var observer = new MutationObserver(callBack);

// 第二步:配置观察选项:
var config = { attributes: true, childList: true, characterData: true }

//第三步: 传入目标节点和观察选项
observer.observe(target, config);

// 随后,你还可以停止观察
observer.disconnect();

在控制台属性发生变化重新调用一次

function watchBody(){
 console.log('body的DOM发生了变化被我监听到了')
}
const observer = new MutationObserver(watchBody)
const targetNode = body
const setConfig = { attributes: true}
observer.observe(targetNode, setConfig)

05.gif

报告:又发现问题,出现多次调用

虽然我们通过监听dom数属性发生变化后,
再次调用水印的方法。用户无法去除水印。
但是造成了多次调用,页面卡死。
目前还没有好的办法去解决使用MutationObserver造成页面卡死这个问题。
所以这种水印只能做到防小人不防君子
  // 修改DOM重新调用水印
  function watchBody(){
    let hasBackgroundImage = document.getElementById('body').style
    if(hasBackgroundImage){
      waterMark()
    }
  }
  let observer;
  // 观察者
  function watchAtt(){
    observer = new MutationObserver(watchBody)
    const targetNode = document.getElementById('body')
    const setConfig = { attributes: true}
    observer.observe(targetNode, setConfig)
  }
  watchAtt()
  // 页面刷新
  window.onbeforeunload=function (){
    console.log(11111)
    observer.disconnect();
  }

06.gif

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body id="body">
  <canvas id="canvasDom" ></canvas>
  <script>
    // 获取当前时间
    function curentTime(userName='张三'){
      let newTime = new Date();
      // 获取年
      let newYarn = newTime.getFullYear()
      // 获取月
      let newMonth = (newTime.getMonth() + 1) > 9 ? ( newTime.getMonth() + 1) : "0" + ( newTime.getMonth() + 1);
      // 获取时间
      let newDay = newTime.getDate() > 9 ? newTime.getDate() : "0"+date.getDate(); 
      return newYarn + '-' + newMonth +' -' + newDay + '-'+ userName
    }
    
![06.gif](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/57dbc4ee8e0d4a42b345b0bd7dd56790~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1913&h=902&s=2562551&e=gif&f=60&b=fafafa)
    function waterMark(){
      // 获取dom节点
      let canvasDom=document.getElementById('canvasDom')
      // 设置canvas的大小
      canvasDom.width=1000
      canvasDom.height=560
      // canvas重叠部分隐藏
      canvasDom.style.display='none'
      // 获取canvs上下文
      const ctx= canvasDom.getContext('2d')
      //设置文字的大小 以及字体样式
      ctx.font = "30px Verdana"
      // 设置透明度
      ctx.fillStyle = 'rgba(0,0,0,.3)'
      // 设置倾斜度
      ctx.rotate(0.2)
      // 填充文字以及位置
      ctx.fillText(curentTime(), 30,150)
      // 将它转化为base64
      const img=canvasDom.toDataURL('image/png')
      let body = document.getElementById('body')
      body.setAttribute('style',`background-image:url("${img}")`)
    }
    waterMark()

    
    // 修改DOM重新调用水印
    function watchBody(){
      let hasBackgroundImage = document.getElementById('body').style
      if(hasBackgroundImage){
        waterMark()
      }
    }
    let observer;
    // 观察者
    function watchAtt(){
      observer = new MutationObserver(watchBody)
      const targetNode = document.getElementById('body')
      const setConfig = { attributes: true}
      observer.observe(targetNode, setConfig)
    }
    watchAtt()
    // 页面刷新
    window.onbeforeunload=function (){
      console.log(11111)
      observer.disconnect();
    }

  </script>
</body>
</html>

标签:body,canvasDom,canvas,observer,newTime,ctx,水印,添加,let
From: https://www.cnblogs.com/IwishIcould/p/17801659.html

相关文章

  • uboot的Makefile添加c文件复制功能--Apple的学习笔记
    一,前言如何能快速知道哪些c被编译到boot了。通过看编译信息,通过看编译完成后的ouput文件夹中的o文件,能否直接copy这些c文件到某个文件夹中,这样搜索看代码定位比较容易。若makefile自己有全部的c路径,那么我做个脚本后处理下,copy这些路径的c即可,另外,makefile居然有复制o文件,那么我只......
  • 海康摄像头添加到大华录像机设置
                                              海康摄像头添加到大华录像机设置1、摄像头端设置高级配置-集成协议勾选启用集成协议添加用户名和密码2、录像机端设置厂商选择:ONVIF协议......
  • Python添加参数的几种方法
    用python添加参数都是用的input函数,不能添加默认值也不能输入help提示。最近发现了2个更好用的库分享给大家。一、使用input库。这个使用很简单,就不过多描述了。deftest(a,b):print(f"{a}+{b}="+str(int(a)+int(b)))if__name__=='__main__':a=input("inputa:......
  • 给视频添加字幕
    给视频添加字幕加字幕Arctimehttps://arctime.org/调轴工具,修改文本https://subplayer.js.org/......
  • 如何将内容添加到数组中?
    内容来自DOChttps://q.houxu6.top/?s=如何将内容添加到数组中?在JavaScript中,如何将一个对象(如字符串或数字)添加到数组中?使用Array.prototype.push方法将值添加到数组的末尾://初始化数组vararr=["Hi","Hello","Bonjour"];//在数组末尾添加新值arr.push(......
  • 视频无痕去水印揭秘那些你不知道的好用软件
    视频无痕去水印怎么去?各位小伙伴在初学剪视频的时候是不是和我一样经常会碰到一个烦人的问题:在网上找到的视频素材总是带着讨厌的水印,不仅影响美观还挡住了视频的一些部分,让人特别不爽,我想各位遇到这种情况的时候肯定会很想知道有没有什么办法能无痕去掉视频上的水印,别急今天我就来......
  • 怎么去除图片水印文字?这3个方法快来收藏
    图片怎么去除水印文字?现在嘛,图片已经成了我们生活和工作里必不可少的一部分,可是有时候看图的时候,总会碰到一些带水印的图片,这些水印总是搞得图片看起来不那么爽,所以很多人都想知道图片怎么去除水印文字,这样就能更好地用这些图片了,今天我就来跟你们说说几种常用的去水印方法,希望对你......
  • 这三个方法快学起来照片一键去文字水印
    照片去文字水印怎么弄?你有没有遇到过这样的烦恼呢?我经常在网上找一些好看的照片来做头像或者壁纸,但是总是遇到一些带水印或者不想要的文字的照片,影响了整体的美观度让人很头疼,每次重新找又得花费不少时间和精力,不过别担心现在有一些好用的去水印工具可以帮助我们轻松解决这个问题,接......
  • flutter 添加依赖的方式
    配置文件pubspec.yamldependencies:flutter:sdk:flutterenglish_words:^4.0.0#ThefollowingaddstheCupertinoIconsfonttoyourapplication.#UsewiththeCupertinoIconsclassforiOSstyleicons.cupertino_icons:^1.0.2path_provi......
  • JS_0077:JS 中对象操作 preventExtensions 禁止添加新属性 defineProperty 添加新属性
    1,//这是定义一个对象constnonExtensible={removalbe:true};//这是通过preventExtensions方法令指定对象无法再添加新的属性Object.preventExtensions(nonExtensib......