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文件, ...
随机推荐
- Scrapy:用cmdline运行爬虫后导致主程序也结束——CrawlerProcesser
学习自: Scrapy官方文档--CrawlerRunner相关 解决django或者其他线程中调用scrapy报ReactorNotRestartable的错误 - liuxianglong - 博 ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
- zookeeper的JAVA API使用
1.创建连接 2.创建节点 3.监听信息 Watcher.class 4.获取节点 Stat stat = new Stat(); zk.getData(Path,true,stat); 5.修改节点 ...
- Dapr 弹性的策略
云原生应用需要处理 云中很容易出现瞬时故障.原因在以下文档 暂时性故障处理[1] 中有具体说明. 任何环境.任何平台或操作系统以及任何类型的应用程序都会发生暂时性故障. 在本地基础结构上运行的解决方案 ...
- 微信小程序简易富文本
- 关于SQL Server 各种安装失败均失败,报错“等待数据库引擎恢复句柄失败”的经验分享
最近安装SQL 2019遇到这个问题,试过自己合网上几乎所有办法,怎么都安装不上,最后在微软社区解决了,由于这个问题比较特殊,并且网上几乎没有正确的决绝方案,因此将我的解决过程及经验记录分享一下,也为 ...
- LGP2726题解
当初 mark 这道题还是因为看到是黑,感觉比较水,然后它现在掉紫了. 不过这题题解居然满了,写一篇给自己看吧. 首先我们有一个思路,就是割掉一条边,然后分别求两颗树的重心. 等等,这好像是CSP原题 ...
- CF1392F题解
首先题意很明显就不说了吧www 先说一下做这道题的经历 昨天下午和 blw 一起去食堂吃饭,和他产生了一点儿冲突,于是我考了一下他 P1119 (就是那道 Floyd),他很快做出来了,于是考了我这道 ...
- SQL基础语法_周志城
一:建库建表语法,字段数据类型 1:建库建表语法 create (创建,关键字) database (数据库,关键字) IF NOT EXISTS 作用:如果需要创建的库已存在,将不会创建 DEF ...
- SpringBoot巧用 @Async 提升API接口并发能力
异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依 ...