canvas 添加水印

🚀 使用 Canvas 给图片添加水印

在 Web 开发中,给图片添加水印可以使用 Canvas API,这样可以确保水印不会被轻易移除,同时不会影响图片的清晰度。


📌 1. 使用 Canvas 给图片添加水印(基础版)

✅ 示例:在图片右下角添加水印

<canvas id="watermarkCanvas"></canvas>
<img id="outputImage" />

<script>
  function addWatermarkToImage(imageSrc, watermarkText) {
    const img = new Image();
    img.crossOrigin = "anonymous"; // 处理跨域问题
    img.src = imageSrc;

    img.onload = () => {
      const canvas = document.getElementById("watermarkCanvas");
      const ctx = canvas.getContext("2d");

      // 设置 Canvas 大小
      canvas.width = img.width;
      canvas.height = img.height;

      // 绘制原始图片
      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

      // 设置水印样式
      ctx.font = "36px Arial";
      ctx.fillStyle = "rgba(255, 255, 255, 0.5)"; // 半透明白色
      ctx.textAlign = "right";
      ctx.textBaseline = "bottom";

      // 添加水印(放在右下角)
      ctx.fillText(watermarkText, canvas.width - 20, canvas.height - 20);

      // 获取最终带水印的图片
      const outputImg = document.getElementById("outputImage");
      outputImg.src = canvas.toDataURL("image/png");
    };
  }

  // 使用示例
  addWatermarkToImage("https://picsum.photos/600/400", "Confidential");
</script>

📌 说明

  • drawImage():绘制原始图片到 Canvas 上。
  • fillText():在 Canvas 上绘制文本水印。
  • toDataURL():将 Canvas 转换成 Base64 图片格式。

📌 2. 在图片中央添加半透明水印

function addCenteredWatermark(imageSrc, watermarkText) {
  const img = new Image();
  img.crossOrigin = "anonymous"; // 处理跨域问题
  img.src = imageSrc;

  img.onload = () => {
    const canvas = document.createElement("canvas");
    const ctx = canvas.getContext("2d");

    canvas.width = img.width;
    canvas.height = img.height;

    // 绘制原图
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

    // 设置水印样式
    ctx.font = "48px Arial";
    ctx.fillStyle = "rgba(255, 255, 255, 0.4)";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";

    // 计算水印位置(居中)
    const x = canvas.width / 2;
    const y = canvas.height / 2;

    // 绘制水印
    ctx.fillText(watermarkText, x, y);

    // 显示最终图片
    document.body.appendChild(canvas);
  };
}

// 使用示例
addCenteredWatermark("https://picsum.photos/600/400", "SAMPLE");

📌 水印位置在图片中央,适合防止裁剪去除。


📌 3. 生成斜角重复水印(防止裁剪去除)

function addRepeatingWatermark(imageSrc, watermarkText) {
  const img = new Image();
  img.crossOrigin = "anonymous";
  img.src = imageSrc;

  img.onload = () => {
    const canvas = document.createElement("canvas");
    const ctx = canvas.getContext("2d");

    canvas.width = img.width;
    canvas.height = img.height;

    // 绘制原始图片
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

    // 设置水印样式
    ctx.font = "24px Arial";
    ctx.fillStyle = "rgba(255, 255, 255, 0.3)";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";

    // 计算水印间距
    const stepX = 200; // 水印横向间距
    const stepY = 100; // 水印纵向间距

    // 斜角循环绘制水印
    for (let x = -canvas.width / 2; x < canvas.width * 1.5; x += stepX) {
      for (let y = -canvas.height / 2; y < canvas.height * 1.5; y += stepY) {
        ctx.save();
        ctx.translate(x, y);
        ctx.rotate(-Math.PI / 6); // 旋转水印
        ctx.fillText(watermarkText, 0, 0);
        ctx.restore();
      }
    }

    // 显示水印图片
    document.body.appendChild(canvas);
  };
}

// 使用示例
addRepeatingWatermark("https://picsum.photos/600/400", "CONFIDENTIAL");

📌 特点

  • 水印重复铺满整个图片,防止裁剪去除。
  • 倾斜角度(rotate(-Math.PI / 6),提高安全性。

📌 4. 下载带水印的图片

如果需要 下载水印图片,可以使用 canvas.toBlob()

function downloadWatermarkedImage(canvas, filename = "watermarked.png") {
  canvas.toBlob((blob) => {
    const link = document.createElement("a");
    link.href = URL.createObjectURL(blob);
    link.download = filename;
    link.click();
  });
}

// 示例:点击按钮下载
document.getElementById("downloadBtn").addEventListener("click", () => {
  const canvas = document.getElementById("watermarkCanvas");
  downloadWatermarkedImage(canvas);
});

🚀 结论

右下角水印:适合 简单水印(但容易裁剪去除)。
居中水印:适合 版权保护,能防止简单裁剪。
重复水印:适合 高级防盗版(大部分图片素材网站使用)。
可下载水印图片,防止原始图片被二次使用。

🎯 如果你的图片需要防止盗用,建议使用 斜角重复水印方案!🚀

posted on 2025-03-15 15:26  ChoZ  阅读(142)  评论(0)    收藏  举报

导航