生成水印遮罩

效果

svg 生成方式

svg 与 canvas 相比浏览器兼容性几乎一致,除了几个早起的 Android 版本,这样的设备以及很难找到了,完全可以忽略。svg 使用的是 XML 的方式,不依赖分辨率,在做水印这件事上 svg 有着更好的优势。

function wateRmark(userName, comName) {
  var svgContent = "<svg width='200' height='200' xmlns='http://www.w3.org/2000/svg'>" +
    "<text x='50%' y='50%' font-size='14' font-weight='800' fill-opacity='0.1' text-anchor='middle' dominant-baseline='middle' transform='rotate(-45, 100 100)'>" +
    userName + "</text><text x='30%' y='50%' font-size='14' font-weight='800' fill-opacity='0.1' text-anchor='middle' dominant-baseline='middle' transform='rotate(-45, 50 60)'>" +
    comName + "</text></svg>"
  var base64 = window.btoa(unescape(encodeURIComponent(svgContent)))
  var base64Url = "data:image/svg+xml;base64," + base64
  var wate = document.createElement('div')
  wate.style.background = 'url(' + base64Url + ') repeat'
  wate.style.position = 'fixed'
  wate.style.left = 0
  wate.style.right = 0
  wate.style.top = 0
  wate.style.bottom = 0
  wate.style.zIndex = '9999'
  wate.style.pointerEvents = 'none'
  document.body.appendChild(wate)
}

canvas 生成方式

canvas 有着不错的兼容性,是一种比较可靠、成熟的可视化技术。但是它比较依赖分辨率,对文本的处理上也有着先天的不足。但是它可以很方便的将结果保存为图片,对于完成水印的需求也是非常合适的。

function renderWateRmark(userName, comName) {
    var canvas = document.createElement('canvas')
    canvas.setAttribute('width', 200)
    canvas.setAttribute('height', 200)
    var ctx = canvas.getContext('2d')
    ctx.clearRect(0, 0, 200, 200)
    ctx.textBaseline = 'top'
    ctx.textAlign = 'left'
    ctx.fillStyle = '#e5e5e5'
    ctx.globalAlpha = 0.4
    ctx.font = '800 14px Microsoft YaHei'
    ctx.translate(20, 100) 
    ctx.rotate(Math.PI / 180 * -45)
    ctx.fillText(comName, 0, 14)
    ctx.fillText(userName, 40, 38)
    var wate1 = document.createElement('div')
    wate1.style.background = 'url(' + canvas.toDataURL() + ') repeat'
    wate1.style.position = 'fixed'
    wate1.style.left = 0
    wate1.style.right = 0
    wate1.style.top = 0
    wate1.style.bottom = 0
    wate1.style.zIndex = '9999'
    wate1.style.pointerEvents = 'none'
    document.body.appendChild(wate1)
}