首页 > 其他分享 >使用canvas在页面增加文字水印

使用canvas在页面增加文字水印

时间:2023-01-18 17:35:14浏览次数:57  
标签:文字 canvas const ctx 水印 Math 页面

学习记录 留作参考
祝君好运

在页面中动态增加水印的几种方法:

  1. 使用 canvasfillText() 结合 rotate() 方法直接生成,本文使用该方法
  2. 使用 canvas 生成一个base64编码的图片,并将其设置为背景元素,csdn的参考文章
  3. 使用 js 动态生成若干个div元素追加到页面中,博客园的参考文章

几种实现方式各有特点。本文通过计算获得了横向与纵向可写文字的组数,主要参数都直接列在了方法的顶部。也可以不用这么麻烦,直接暴力的给一个很大的画布,然后再画非常多的水印也行。

MDN内canvas的参考文档

<!-- 可以通过控制canvas元素的 position属性、z-index属性 来控制该元素的展示情况 -->
<canvas id="canvas" style="position:fixed;z-index:-1;top:0;left:0;"></canvas>

<script type="text/javascript" src="./resource/jquery.min.js"></script>
<script type="text/javascript">
    // 页面加载完成后去添加水印
    $(function () {
        water()
    })

    // 当页面大小发生改变时也要重新绘制水印,增加一个延迟,防止触发频率过高
    let resizeId = null
    $(window).resize(function () {
        if (resizeId) {
            clearTimeout(resizeId);
        }
        resizeId = setTimeout(() => {
            water()
        }, 80);
    });


    function water() {
        const fontSize = 20; // 字体大小
        const degree = -30; // 旋转角度,顺时针为正,逆时针为负
        const areaWidth = window.innerWidth; // 水印区域的宽度
        const areaHeight = window.innerHeight; // 水印区域的高度
        const nameStr = 'XX国际贸易有限公司';
        const timeStr = '2023/1/18 12:00';
        const lineSpace = 250; // 每行文字的垂直间隔(包含文字高度),px
        const colSpace = 2; // 显示文字的区域的宽度与文字宽度的比例

        const canvas = document.getElementById('canvas');
        canvas.setAttribute('width', areaWidth)
        canvas.setAttribute('height', areaHeight)

        const ctx = canvas.getContext('2d');

        ctx.rotate(degree * Math.PI / 180);
        ctx.font = `${fontSize}px Microsoft Yahei`; // 设置字体及大小
        const textWidth = ctx.measureText(nameStr).width // 获取文字宽度
        const textUnitWidth = textWidth * colSpace; // 一个文字单元的宽度(文字宽度+左右空白)

        ctx.fillStyle = 'rgba(0, 0, 0, 0.2)'; // 字体的颜色
        ctx.textAlign = "center"; // 文本的对齐方式
        ctx.textBaseline = "middle"; // 文本的基线属性
        // ctx.globalAlpha = 0.5; // 透明度

        ctx.translate(100, 100); // 给画面一个基础偏移量,也可以省略该值

        let xNum = Math.ceil(areaWidth / textUnitWidth) //不旋转时横向可以展示的最多文字单元数
        let yNum = Math.ceil(areaHeight / lineSpace)//(不旋转时)纵向可以展示的最多文字单元数

        // 当文字旋转时,有一部分文字会被转走,需要扩展写字的范围,使用正弦函数确定扩展的最大范围
        let xStart = 0, yStart = 0, sin = Math.sin(Math.abs(degree) * Math.PI / 180);
        if (degree > 0) {
            // 顺时针旋转时,右侧和上侧可能会有空余
            xNum += Math.ceil(sin * areaHeight / textUnitWidth);
            yStart = Math.ceil(sin * areaWidth / lineSpace) + -1;
        } else {
            // 逆时针旋转时,左侧和下侧可能会有空余
            xStart = Math.ceil(sin * areaHeight / textUnitWidth) * -1;
            yNum += Math.ceil(sin * areaWidth / lineSpace);
        }

        for (let x = xStart; x < xNum; x++) {
            for (let y = yStart; y < yNum; y++) {
                const offsetY = y % 2 == 0 ? 0 : textUnitWidth / 2; // 隔行横向偏移一半的距离
                const startX = textUnitWidth * x + offsetY; // 文字的X轴起始点
                const startY = lineSpace * y; // 文字的Y轴起始点
                ctx.fillText(nameStr, startX, startY);
                ctx.fillText(timeStr, startX, startY + fontSize * 1.5);
            }
        }

        // 也可以使用图片水印,
        // 可以使用具体图片,也可以使用后台传来的base64图片,也可以是使用canvas生成的base64图片
        // let img = new Image();
        // img.src = './resource/1.png';
        // ctx.drawImage(img, 150, 350);
    }
</script>

效果图如下
image

标签:文字,canvas,const,ctx,水印,Math,页面
From: https://www.cnblogs.com/liulog/p/17060181.html

相关文章

  • [兼容问题]关于页面适配的整理
    先进行分类。有空填坑。 1.pc长页面,h5长页面,根据浏览器宽度适配。考虑:fixed属性的页面头部、弹窗,可能需要才用.container.top .pup三部分分别进行适配。(参考wh春......
  • vue 监听页面的滚动到页面底部
    HTML<divclass="moredata"v-if="loading"><van-loadingsize="24px">加载中...</van-loading></div><divclass="moredata"v-if="fineshed">{{moredata}}</div>D......
  • 页面局部生成图片下载
    业务需求:需要将UI设计图结合后台数据拼成所需要的图片并实现下载功能。 本文所用插件:html2canvasgit地址:https://github.com/niklasvh/html2canvas用法:下载依赖:yarn......
  • selenium_webdriver_ java 进行元素定位时的页面跳转问题
    在UI自动化测试操作过程中有时候点击某个链接会弹出新的窗口,这时我们如果需要操作新打开页面中的元素,就需要将页面切换到新打开的页面上再进行操作。java实现如下://窗口切......
  • 20.Selenium【iframe切换】切换页面的iframe、handlers
    一、前言在做web自动化的时候,我们往往会遇到两种切换:iframe、handler。iframe表示在主html上嵌入的子html页面(说人话就是一个页面中套着一个或多个页面);handler表示一个新......
  • 15.Selenium【弹出框操作】模拟操作页面弹窗
    一、前言我们在做项目的时候,经常会遇到弹窗的出现,而弹窗不是页面元素,无法定位并操作。那么我们如何处理弹窗呢,本节课将介绍弹窗的相关操作。二、学习目标1.Alert类型弹......
  • 12.Selenium【元素操作】模拟操作页面元素
    一、前言前面的课程我们已经学习了定位元素的八大方法,其实在实际工作中只需掌握xpath定位即可满足工作需求。定位元素后,我们得到一个元素对象,从这节课开始我们开始针对这......
  • 13.Selenium【鼠标和键盘操作】模拟鼠标操作页面元素(了解)
    一、前言actionchains是selenium里面专门处理鼠标和键盘相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。这对于做更复杂的动作非常有用,比如悬停和拖放。......
  • 3.Selenium【页面操作】模拟页面相关操作
    一、前言有了浏览器对象,我们可以请求页面并对页面做操作了,本节课针对模拟页面操作作主要讲解。二、学习目标1.打开请求地址2.driver的常用属性3.页面的其他方法三、......
  • Angular 应用如何回退到之前曾经浏览过的页面
    我们使用下面的代码,将Router注入到应用程序Component的构造函数里,然后再调用其navigate方法,这种思路只能实现SPA应用间的静态路由跳转。import{Router}from'......