当前位置:首页 > JavaScript

js水印实现

2026-02-02 06:07:54JavaScript

基础水印实现

使用Canvas绘制水印并覆盖在页面上是最常见的方法。以下代码创建了一个半透明文字水印:

function createWatermark(text) {
  const canvas = document.createElement('canvas');
  canvas.width = 300;
  canvas.height = 200;
  const ctx = canvas.getContext('2d');

  ctx.font = '16px Arial';
  ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
  ctx.rotate(-0.3);
  ctx.fillText(text, 30, 100);

  return canvas.toDataURL();
}

const watermarkDiv = document.createElement('div');
watermarkDiv.style.position = 'fixed';
watermarkDiv.style.top = '0';
watermarkDiv.style.left = '0';
watermarkDiv.style.width = '100%';
watermarkDiv.style.height = '100%';
watermarkDiv.style.pointerEvents = 'none';
watermarkDiv.style.backgroundImage = `url(${createWatermark('机密文件')})`;
watermarkDiv.style.backgroundRepeat = 'repeat';
document.body.appendChild(watermarkDiv);

防删除水印方案

为防止用户通过开发者工具删除水印元素,可采用MutationObserver监控DOM变化:

const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (!document.body.contains(watermarkDiv)) {
      document.body.appendChild(watermarkDiv);
    }
  });
});

observer.observe(document.body, {
  childList: true,
  subtree: true
});

// 防止控制台修改样式
Object.defineProperty(watermarkDiv.style, 'display', {
  get() { return 'block'; },
  set() {}
});

SVG矢量水印实现

对于需要高清显示的场景,使用SVG水印效果更佳:

js水印实现

function createSvgWatermark(text) {
  const svg = `
    <svg width="300" height="200" xmlns="http://www.w3.org/2000/svg">
      <text x="50" y="100" 
            font-family="Arial" 
            font-size="16" 
            fill="rgba(0,0,0,0.1)" 
            transform="rotate(-20)">
        ${text}
      </text>
    </svg>`;
  return `data:image/svg+xml;base64,${btoa(svg)}`;
}

// 使用方式与Canvas类似

动态水印方案

为增加破解难度,可以实现动态变化的水印:

function generateRandomString() {
  return Math.random().toString(36).substring(2, 10);
}

setInterval(() => {
  watermarkDiv.style.backgroundImage = `url(${createWatermark(generateRandomString())})`;
}, 5000);

图片水印处理

为现有图片添加水印可使用以下方法:

js水印实现

function watermarkImage(originalImage, watermarkText) {
  const canvas = document.createElement('canvas');
  canvas.width = originalImage.width;
  canvas.height = originalImage.height;
  const ctx = canvas.getContext('2d');

  ctx.drawImage(originalImage, 0, 0);
  ctx.font = '30px Arial';
  ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
  ctx.fillText(watermarkText, 50, 50);

  return canvas.toDataURL('image/png');
}

水印样式优化

提升水印美观度和隐蔽性的样式建议:

  • 使用渐变透明度:rgba(0,0,0,0.05)
  • 添加文字阴影:text-shadow: 1px 1px 3px rgba(0,0,0,0.2)
  • 多行文字排列
  • 倾斜角度控制在15-30度之间

服务端水印方案

对于重要文档,建议在服务端生成水印。Node.js示例:

const sharp = require('sharp');
const fs = require('fs');

async function addWatermark(inputPath, outputPath) {
  await sharp(inputPath)
    .composite([{
      input: Buffer.from(`
        <svg width="500" height="100">
          <text x="50" y="50" font-family="Arial" font-size="20" fill="rgba(0,0,0,0.3)">机密文档</text>
        </svg>
      `),
      gravity: 'southeast'
    }])
    .toFile(outputPath);
}

标签: 水印js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

vue实现列表水印

vue实现列表水印

实现列表水印的方法 在Vue中为列表添加水印可以通过多种方式实现,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性为列表元素添加水印背景。水印可以是文字或…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…