当前位置:首页 > JavaScript

js实现水印

2026-01-31 14:50:30JavaScript

使用Canvas绘制水印

在HTML中创建一个Canvas元素,通过JavaScript绘制文字或图片水印。Canvas提供了灵活的绘图API,可以自定义水印的样式和位置。

function addWatermark(text, options = {}) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = options.width || 200;
  canvas.height = options.height || 100;

  ctx.font = options.font || '16px Arial';
  ctx.fillStyle = options.color || 'rgba(0, 0, 0, 0.1)';
  ctx.textAlign = options.align || 'center';
  ctx.textBaseline = options.baseline || 'middle';

  ctx.fillText(text, canvas.width / 2, canvas.height / 2);

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

应用水印到页面

将生成的水印作为背景图片应用到目标元素上,通过CSS的background-image属性实现平铺效果。

function applyWatermark(element, watermarkUrl) {
  element.style.backgroundImage = `url(${watermarkUrl})`;
  element.style.backgroundRepeat = 'repeat';
}

动态水印保护

为了防止用户通过开发者工具删除水印,可以使用MutationObserver监听DOM变化,当水印被移除时重新添加。

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

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

SVG水印实现

使用SVG创建矢量水印,具有更好的清晰度和缩放性能。SVG水印可以通过Base64编码嵌入到CSS中。

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

图片水印处理

对于需要添加水印的图片,可以使用Canvas将水印绘制到原始图片上,然后导出新的图片数据。

async function addWatermarkToImage(imageUrl, watermarkText) {
  const img = new Image();
  img.crossOrigin = 'Anonymous';
  img.src = imageUrl;

  await new Promise((resolve) => img.onload = resolve);

  const canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  const ctx = canvas.getContext('2d');

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

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

水印样式自定义

提供多种样式选项,允许用户自定义水印的角度、透明度、间距等属性。

function createCustomWatermark(text, {
  fontSize = 20,
  color = 'rgba(0,0,0,0.1)',
  angle = -30,
  spacing = 100
} = {}) {
  const canvas = document.createElement('canvas');
  const size = spacing * 2;
  canvas.width = size;
  canvas.height = size;
  const ctx = canvas.getContext('2d');

  ctx.font = `${fontSize}px Arial`;
  ctx.fillStyle = color;
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  ctx.translate(size / 2, size / 2);
  ctx.rotate(angle * Math.PI / 180);
  ctx.fillText(text, 0, 0);

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

全屏水印实现

创建一个覆盖整个页面的水印层,使用绝对定位和z-index确保水印显示在内容上方。

function createFullscreenWatermark(text) {
  const watermark = document.createElement('div');
  watermark.style.position = 'fixed';
  watermark.style.top = '0';
  watermark.style.left = '0';
  watermark.style.width = '100%';
  watermark.style.height = '100%';
  watermark.style.pointerEvents = 'none';
  watermark.style.zIndex = '9999';
  watermark.style.backgroundImage = `url(${createCustomWatermark(text)})`;

  document.body.appendChild(watermark);
  return watermark;
}

js实现水印

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

相关文章

css3结合js制作

css3结合js制作

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

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…

vue实现水印

vue实现水印

添加静态水印 在Vue中可以通过CSS或Canvas实现静态水印。CSS方式适合简单文字水印,Canvas适合复杂图形或自定义样式。 CSS方式 通过绝对定位和透明度控制,将水印覆盖在页面上:…