欲实现的水印平铺的效果图如下:

从图上看,应该做到以下几点:

  1. 文字在X和Y方向上进行平铺;

  2. 文字进行了一定的角度的旋转;

  3. 水印作为背景,其z-index位置应位于页面内容底部, 即不能覆盖页面主内容;

  4. 平铺的水印应能随窗口大小改变进行自适应。

思路:

首先我们先在canvas上绘制如下图所示一小块画布:

var tpl = '<canvas id = "watermark" width = "160px"  height = "100px" style="display:none;"></canvas>';

将单一水印绘制在canvas画布里,然后将canvas节点插入到需要平铺水印的容器里,例如这里将canvas标签插入到body里面。

$(document.body).append(tpl);

这里简要说明:canvas标签width height属性,若不进行指定,则会有个默认的大小(300px * 150px),并且,这块画布的大小使用外部css文件设定宽高是无效的。

下面开始在canvas里面绘制单一水印:

var cw = $('#watermark')[0];
var ctx = cw.getContext("2d"); //返回一个用于在画布上绘图的环境
ctx.cearRect(0,0,160,100); //绘制之前画布清除
ctx.font="20px 黑体";
ctx.rotate(-20*Math.PI/180);
ctx.fillStyle = "rgba(100,100,100,0.1)";
ctx.fillText("465dd92381", -20, 80);
ctx.rotate('20*Math.PI/180'); //坐标系还原

实现了一小块画布的绘制以后,再建一个canvas画布(id为repeat-watermark):

var tplr = '<canvas id = "repeat-watermark"></canvas>';
$(document.body).append(tplr);

为整块画布设定样式:

#repeat-watermark{
position:fixed;
z-index:-1;
top:0;
background: #fff;
}

z-index的值可以根据需要调整,使其位于页面底部平铺。
另作一点说明:位于水印上层的页面如果想让水印始终可见,可以将页面中使用的颜色使用rgba设置。

下面将前面绘制的id为watermark的canvas 在当前的canvas(id为repeat-watermark)里采用createPattern方法进行平铺:

var crw = $('#repeat-watermark')[0];
crw.width = $(document).width();
crw.height = $(document).height();
ctxr = crw.getContent("2d");
ctxr.clearRect(0,0,crw.width,crw.height); //清除整个画布
var pat = ctxr.createPattern(cw, "repeat"); //在指定的方向上重复指定的元素
ctxr.fillStyle = pat;
ctxr.fillRect(0, 0, crw.width, crw.height);

此时还有一个问题,由于水印绘制只随着页面进行了一次加载,因而当窗口改变大小时,页面背景水印不会跟随改变进行填充或者裁剪,而是会出现空白,因此,将上述绘制水印封装为draw方法,然后添加以下事件:

$(window).resize(function(){
var w = $(document).width();
var h = $(document).height();
self.draw(w, h);
});

下面附上源码:

'use strict';

require('./watermark.css');

var Watermark = function(container, options) {
var self = this;
self.opt = {
docWidth: $(document).width(),
docHeight: $(document).height(),
fontStyle: "20px 黑体", //水印字体设置
rotateAngle: -20 * Math.PI / 180, //水印字体倾斜角度设置
fontColor: "rgba(100, 100, 100, 0.1)", //水印字体颜色设置
firstLinePositionX: -20, //canvas第一行文字起始X坐标
firstLinePositionY: 80, //Y
SecondLinePositionX: 0, //canvas第二行文字起始X坐标
SecondLinePositionY: 70 //Y
};
$.extend(self.opt, options);
self.render(container);
self.draw(self.opt.docWidth, self.opt.docHeight);
self.events();
}; Watermark.prototype = {
render: function(d) {
var self = this;
d.append(tpl);
}, draw: function(docWidth, docHeight) {
var self = this;
var cw = $('#watermark')[0];
var crw = $('#repeat-watermark')[0]; crw.width = docWidth;
crw.height = docHeight; var ctx = cw.getContext("2d");
//清除小画布
ctx.clearRect(0, 0, 160, 100);
ctx.font = self.opt.fontStyle;
//文字倾斜角度
ctx.rotate(self.opt.rotateAngle); ctx.fillStyle = self.opt.fontColor;
//第一行文字
ctx.fillText(self.opt.watermark, self.opt.firstLinePositionX, self.opt.firstLinePositionY);
//第二行文字
//ctx.fillText(window.watermark.mobile, self.opt.SecondLinePositionX, self.opt.SecondLinePositionY);
//坐标系还原
ctx.rotate(-self.opt.rotateAngle); var ctxr = crw.getContext("2d");
//清除整个画布
ctxr.clearRect(0, 0, crw.width, crw.height);
//平铺--重复小块的canvas
var pat = ctxr.createPattern(cw, "repeat");
ctxr.fillStyle = pat; ctxr.fillRect(0, 0, crw.width, crw.height);
},
events: function() {
var self = this;
$(window).resize(function() {
var w = $(document).width();
var h = $(document).height();
self.draw(w, h);
});
} }; var tpl = '<canvas id = "watermark" width = "160px" height = "100px" style="display:none;"></canvas>' + '<canvas id = "repeat-watermark"></canvas>'; module.exports = Watermark;

canvas实现平铺水印的更多相关文章

  1. php 给图片增加背景平铺水印代码

    如果你想利用php 给图片增加背景平铺水印效果话,必须利用php的一个插件来实例,就是利用imagick,他可以给图片增加背景平铺水印效果哦,下面我们提供一款实例代码. 如果你想利用php教程 给图片 ...

  2. LODOP打印超文本保留背景色带平铺水印

    前面的博文:LODOP中设置设置图片平铺水印,超文本透明. 介绍过 ,如果不想去掉超文本的背景色,想在超文本背景色和超文本内容文字之间加上水印,让水印在背景色上面,文字下面,是不行的,因为平铺的图片和 ...

  3. Java 在Excel中添加水印(单一水印、平铺水印)

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...

  4. Canvas 图片平铺设置

    /** * 图片平铺 */ function initDemo7(){ var canvas = document.getElementById("demo7"); if (!ca ...

  5. canvas实现平铺

    代码: /** * Created by Administrator on 2016/1/30. */ function draw(id){ var canvas = document.getElem ...

  6. LODOP中设置设置图片平铺水印,超文本透明

    之前的博文:LODOP中平铺图片 文本项Repeat. 该博文中是平铺的图片,上面是文本.如果是图片add_print_image和add_print_text纯文本,这两个打印项设计的,可以直接通过 ...

  7. Java 在PPT中添加文本水印的简易方法(单一/平铺水印)

    [前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...

  8. 如何用vue封装一个防用户删除的平铺页面的水印组件

    需求 为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印 要求水印内容为用户名,水印节点用户不能通过开发者工具等删除 效果 如上图 在body节点下插入水印DOM节点,水印节点覆盖在页面 ...

  9. Java 设置PDF平铺图片背景(水印)

    一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...

随机推荐

  1. 哈工大 计算机系统 实验一 Linux下C工具应用

    所有实验文件可见github 计算机系统实验整理 实验报告 实 验(一) 题 目 Linux下C工具应用 专 业 计算机学院 学 号 班 级 学 生 指 导 教 师 实 验 地 点 实 验 日 期 计 ...

  2. Pycharm:在Pycharm中使用控制台命令

    最下方跟Console同行的Terminal,其中输入指令就相当于在cmd命令行窗口输入指令

  3. 积分图(二) - Block - Match(统计)滤波器

    原文地址(英文) 积分图 是 [Crow(1984 年)] 提出的用于提高多尺度透视投影中纹理的渲染速度的一种技术. 积分图最流行的应用是 快速归一化互相关 (fast normalized cros ...

  4. appium滚动查找屏幕外的控件

    嗯,还是把自己做的实验保存一下 Appium1.12.1+python2.7 实验滚动,查找屏幕外控件以及控制seekbar scroll() 是根据页面中两个元素位置之间的距离进行滑动. 滑动寻找屏 ...

  5. 有效提升Python代码性能的三个层面

    使用python进入一个熟练的状态之后就会思考提升代码的性能,尤其是python的执行效率还有很大提升空间(委婉的说法).面对提升效率这个话题,python自身提供了很多高性能模块,很多大牛开发出了高 ...

  6. linux中mariadb用navicat远程连接

    在Linux中创建数据库并且远程图形化工具连接 安装数据库 [root@node1 ~]# yum install mariadb-server -y #这里我使用的mariadb 其他数据库也可以 ...

  7. CF1548B题解

    在日报上面看到的,发现 NOIP 模拟赛考过这个 trick( 首先我们把题目要求的条件这么写: \[a_i=x_i \times m+k \] 那么我们要找到满足条件的数组,差分后的数组一定都是 \ ...

  8. Android 12(S) 图形显示系统 - BufferQueue的工作流程(九)

    题外话 Covid-19疫情的强烈反弹,小区里检测出了无症状感染者.小区封闭管理,我也不得不居家办公了.既然这么大把的时间可以光明正大的宅家里,自然要好好利用,八个字 == 努力工作,好好学习 一.前 ...

  9. SpringBoot 中实现跨域的几种方式

    一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. ...

  10. Mybatis将mapper映射文件配置到recources下

    关于为什么要将Mybatis的mappers.xml文件配置到resources目录下的粗浅看法: (1).使文件目录更加清晰.resources文件目录下通常为配置文件,所以将Mappers.xml ...