前些时候遇到了预览文档或图片加水印的需求,看资料了解到,水印分明水印(前端实现)和暗水印(后端实现)两类,明水印容易实现但也容易破解,暗水印相比更安全。
明水印的实现方式
-
div 实现
-
canvas 背景图实现
需要加水印的图片:
1 |
|
1 |
|
首先我们试试用添加 div 的方式实现水印
1 |
|
效果实现如下:
实现思路: 1.生成和图片尺寸一样的 shadow,通过绝对定位盖在图片上 2.通过图片的尺寸和水印的尺寸计算出水印有几行几列 3.通过 flex 布局将水印排列到 shadow 上
再来试试 canvas 背景图实现水印
markByCanvas.js
1 |
|
效果实现如下:
** 实现思路:** 1.利用canvas
绘制一个水印 2.通过canvas.toDataURL()
来拿到文件流的 url 3.将 url 填充在一个元素的背景中,设置背景图片的属性为repeat
明水印防破解方式
以上的实现方式,还是很容易破解的,因为原理都是在图片上层添加遮罩实现的,只要用 F12 删除遮罩的 Dom 即可(这也太 EZ 了 😭)
为了避免出现这种事,前端还是可以做出点努力的,这就用到了Mutation Observer API
,MutationObserver 是元素观察器,字面上就可以理解这是用来观察 Node 变化的。
在这里我们的监听对象为<div id="app"></div>
, 一旦监听到我们的水印元素被删除,或者属性修改,我们就重新生成一个。可以这样实现:
1 |
|
大功告成,再也不怕遮罩 Dom 被手动删除了~ 遗憾的是,尽管如此,还是有破解方法,比如删除遮罩 Dom 前先禁用浏览器的 JavaScript。。
总结
使用 canvas 作背景或直接添加 div 就是明水印比较常规的实现方式啦,就算是明水印也可以通过 Mutation Observer 做些简单的防护,但是对于直接禁用 Javascript 的浏览器就束手无策了 😄。