当前位置:首页 > JavaScript

js 实现图片水印

2026-03-01 08:33:24JavaScript

使用Canvas实现图片水印

通过Canvas绘制水印并叠加到原图上,适用于前端动态生成水印。以下是一个基础实现示例:

function addWatermarkToImage(imageUrl, watermarkText, outputFormat = 'image/png') {
  const img = new Image();
  img.crossOrigin = 'anonymous';
  img.src = imageUrl;

  return new Promise((resolve) => {
    img.onload = () => {
      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 = '20px Arial';
      ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';

      // 平铺水印
      for (let x = 0; x < canvas.width; x += 150) {
        for (let y = 0; y < canvas.height; y += 100) {
          ctx.fillText(watermarkText, x, y);
        }
      }

      resolve(canvas.toDataURL(outputFormat));
    };
  });
}

// 使用示例
addWatermarkToImage('original.jpg', 'Confidential')
  .then(watermarkedImage => {
    document.getElementById('outputImage').src = watermarkedImage;
  });

使用CSS实现视觉水印

通过CSS伪元素或背景图实现非破坏性水印,适合需要保留原图的场景:

<style>
  .watermarked-container {
    position: relative;
    display: inline-block;
  }

  .watermarked-container::after {
    content: "Watermark Text";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2em;
    color: rgba(255, 255, 255, 0.5);
    pointer-events: none;
    transform: rotate(-45deg);
    background: repeating-linear-gradient(
      45deg,
      transparent,
      transparent 100px,
      rgba(0,0,0,0.1) 100px,
      rgba(0,0,0,0.1) 200px
    );
  }
</style>

<div class="watermarked-container">
  <img src="original.jpg" alt="Original Image">
</div>

使用SVG作为水印背景

创建可缩放的矢量水印,适合需要高清晰度的场景:

function createSVGWatermark(text, options = {}) {
  const { 
    fontSize = 20, 
    opacity = 0.5, 
    color = '#FFFFFF', 
    angle = -45 
  } = options;

  const svg = `
    <svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
      <text 
        x="50%" 
        y="50%" 
        font-size="${fontSize}" 
        fill="${color}" 
        opacity="${opacity}"
        text-anchor="middle" 
        dominant-baseline="middle"
        transform="rotate(${angle} 100 100)">
        ${text}
      </text>
    </svg>
  `;
  return `url('data:image/svg+xml;utf8,${encodeURIComponent(svg)}')`;
}

// 应用示例
const watermarkStyle = {
  backgroundImage: createSVGWatermark('Sample', { fontSize: 30 }),
  backgroundRepeat: 'repeat'
};
document.getElementById('targetElement').style.backgroundImage = watermarkStyle.backgroundImage;

防篡改水印实现

通过修改像素数据实现难以去除的水印:

function applySecureWatermark(imageData, intensity = 5) {
  const data = imageData.data;
  // 在每个像素的LSB(最低有效位)嵌入水印信息
  for (let i = 0; i < data.length; i += 4) {
    if (i % 16 === 0) { // 降低密度避免过于明显
      data[i] = data[i] ^ intensity;   // R
      data[i+1] = data[i+1] ^ intensity; // G
      data[i+2] = data[i+2] ^ intensity; // B
    }
  }
  return imageData;
}

// 配合Canvas使用
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(imgElement, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const watermarkedData = applySecureWatermark(imageData);
ctx.putImageData(watermarkedData, 0, 0);

动态水印生成库推荐

对于生产环境,可以考虑以下成熟库:

  • watermark.js:轻量级库,支持文本/图片水印
  • fabric.js:功能强大的Canvas库,包含水印功能
  • react-watermark:专为React设计的水印组件

安装watermark.js的示例:

npm install watermarkjs

使用示例:

js 实现图片水印

import watermark from 'watermarkjs';

watermark(['original.jpg'])
  .image(watermark.text.lowerRight('Watermark', '24px Arial', '#fff', 0.5))
  .then(img => document.body.appendChild(img));

标签: 水印图片
分享给朋友:

相关文章

vue 实现图片

vue 实现图片

Vue 实现图片加载与展示的方法 在 Vue 中实现图片加载和展示可以通过多种方式完成,包括静态资源引用、动态绑定、懒加载等。以下是几种常见的方法: 静态资源引用 将图片放在项目的 public 或…

js实现图片滚动效果

js实现图片滚动效果

使用CSS动画实现图片滚动 通过CSS的@keyframes和animation属性实现无缝滚动效果。将图片容器设置为横向排列,通过动画平移位置。 <style> .scroll-c…

jquery 图片

jquery 图片

jQuery 图片操作 jQuery 提供了多种方法来操作图片,包括加载、显示、隐藏、调整尺寸等。以下是一些常见的图片操作方法: 动态加载图片 使用 attr() 方法可以动态修改图片的 src 属…

jquery图片

jquery图片

jQuery 图片操作 jQuery 提供了多种方法来处理图片,包括加载、显示、隐藏、动画效果等。以下是一些常见的 jQuery 图片操作方法: 动态加载图片 使用 jQuery 的 attr()…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…

vue实现滑动图片

vue实现滑动图片

实现滑动图片的基本思路 在Vue中实现滑动图片效果,通常可以通过以下几种方式完成。滑动图片的核心在于处理用户触摸或鼠标事件,计算位移,并动态调整图片位置。 使用CSS过渡和Vue数据绑定 通过Vue…