当前位置:首页 > 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作为水印背景

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

js 实现图片水印

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

动态水印生成库推荐

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

js 实现图片水印

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

安装watermark.js的示例:

npm install watermarkjs

使用示例:

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 中,可以通过 v-for 指令循环渲染图片组件。假设有一组图片数据需要循环展示,可以采用以下方式: 数据准备 在组件的 data 或 props 中定义…

H5图片实现地图

H5图片实现地图

实现H5图片地图的方法 在H5中实现图片地图功能,可以通过以下方式完成。图片地图允许用户在图片的特定区域点击,触发不同的交互效果。 使用HTML的<map>和<area>标签…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

js实现图片的懒加载

js实现图片的懒加载

实现图片懒加载的基本原理 懒加载的核心思想是延迟加载非视口内的图片,当用户滚动页面时再动态加载即将进入视口的图片资源。这能显著减少页面初始加载时的网络请求和带宽消耗。 Intersection Ob…

vue 实现 图片预览

vue 实现 图片预览

实现图片预览功能 在Vue中实现图片预览功能可以通过多种方式完成,以下是几种常见的方法: 使用HTML5的FileReader API 通过FileReader读取用户上传的图片文件并显示预览:…

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…