canvas实现平铺水印
欲实现的水印平铺的效果图如下:
从图上看,应该做到以下几点:
文字在X和Y方向上进行平铺;
文字进行了一定的角度的旋转;
水印作为背景,其z-index位置应位于页面内容底部, 即不能覆盖页面主内容;
平铺的水印应能随窗口大小改变进行自适应。
思路:
首先我们先在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实现平铺水印的更多相关文章
- php 给图片增加背景平铺水印代码
如果你想利用php 给图片增加背景平铺水印效果话,必须利用php的一个插件来实例,就是利用imagick,他可以给图片增加背景平铺水印效果哦,下面我们提供一款实例代码. 如果你想利用php教程 给图片 ...
- LODOP打印超文本保留背景色带平铺水印
前面的博文:LODOP中设置设置图片平铺水印,超文本透明. 介绍过 ,如果不想去掉超文本的背景色,想在超文本背景色和超文本内容文字之间加上水印,让水印在背景色上面,文字下面,是不行的,因为平铺的图片和 ...
- Java 在Excel中添加水印(单一水印、平铺水印)
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
- Canvas 图片平铺设置
/** * 图片平铺 */ function initDemo7(){ var canvas = document.getElementById("demo7"); if (!ca ...
- canvas实现平铺
代码: /** * Created by Administrator on 2016/1/30. */ function draw(id){ var canvas = document.getElem ...
- LODOP中设置设置图片平铺水印,超文本透明
之前的博文:LODOP中平铺图片 文本项Repeat. 该博文中是平铺的图片,上面是文本.如果是图片add_print_image和add_print_text纯文本,这两个打印项设计的,可以直接通过 ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- 如何用vue封装一个防用户删除的平铺页面的水印组件
需求 为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印 要求水印内容为用户名,水印节点用户不能通过开发者工具等删除 效果 如上图 在body节点下插入水印DOM节点,水印节点覆盖在页面 ...
- Java 设置PDF平铺图片背景(水印)
一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...
随机推荐
- Windows11中如何使用旧版本IE浏览器打开网页
Windows11删除了旧版本IE浏览器,完全采用了Edge,但是我们进行网站测试时有时仍会用到IE浏览器,那么可以按照以下步骤启用: 1.进入Edge浏览器中,打开设置,进入默认浏览器选项下: 修改 ...
- Python:GUI库tkinter(一)
学习自: Python GUI 编程(Tkinter) | 菜鸟教程 TkDocs_官方文档 1.几个常用的Python GUI库 tkinter:Python的标准Tk GUI工具包的接口. wxP ...
- (第一章第三部分)TensorFlow框架之会话
系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html (二)TensorFlow框架之图与Tensor ...
- JZ-055-链表中环的入口结点
链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目链接: 链表中环的入口结点 代码 import java.util.ArrayList; ...
- CF1228E题解
设 \(f_{i,j}\) 为恰好 \(i\) 行 \(j\) 列不满足条件的矩阵个数, \(g_{i,j}\) 为钦定 \(i\) 行 \(j\) 列不满足条件的矩阵个数. 容易得到: \[g_{x ...
- VuePress 博客优化之开启 Algolia 全文搜索
前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 由于 V ...
- 面试突击32:为什么创建线程池一定要用ThreadPoolExecutor?
在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类来说,线程池的创建总共分为两大类:手动方式使用 ThreadPoolExecutor 创建线程池和使用 Ex ...
- fashion_mnist 计算准确率、召回率、F1值
本文发布于 2020-12-27,很可能已经过时 fashion_mnist 计算准确率.召回率.F1值 1.定义 首先需要明确几个概念: 假设某次预测结果统计为下图: 那么各个指标的计算方法为: A ...
- 想让DBA瞬间崩溃,那就让他去做SQL性能优化
摘要:很多大数据计算都是用 SQL 实现的,跑得慢时就要去优化 SQL,但常常碰到让人干瞪眼的情况. 本文分享自华为云社区<做 SQL 性能优化真是让人干瞪眼>,作者: 石臻臻的杂货铺 . ...
- el-upload用form的方式多文件上传的方法
使用el-upload组件遇到的坑. 1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了. 发送请求的部分没有注释的部分是我分装了调后台的api,注释 ...