当前位置:首页 > 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水印效果更佳:

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);

图片水印处理

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

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示例:

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实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…