• 作者:老汪软件技巧
  • 发表时间:2024-11-06 10:01
  • 浏览量:

在现代Web开发中,图像处理是一个常见的需求,尤其是为图片添加水印。水印常用于标记图像的版权、出处或时间信息等。本文将详细介绍如何使用HTML5的Canvas技术为图片添加水印,讲解代码实现的每一个细节,帮助大家理解整个过程,并且能够灵活运用。

一、HTML5 Canvas概述

Canvas是HTML5新增的一个元素,它提供了一个用于动态生成图像的画布环境。通过JavaScript,我们可以在Canvas上绘制图形、文本或图像。Canvas非常适合处理图像编辑、图形绘制、动画等任务。

Canvas的基本用法:创建Canvas元素:通过HTML中定义标签。获取Canvas上下文:Canvas的绘图操作都是基于其上下文进行的。通过getContext('2d')可以获取一个2D绘图上下文对象,进而执行各种绘图操作。绘制操作:包括绘制图像、矩形、圆形、路径等。二、实现代码分析

接下来,我们对代码进行详细的分析,逐步理解每一部分的功能和实现方式。

function addMark(base64, text, currentTime) {
  var img = new Image();
  img.src = base64;
  img.onload = function() {
    // 准备canvas环境
    var canvas = document.getElementById("myCanvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    
    // 绘制图片
    ctx.drawImage(img, 0, 0);
    // 识别左上角颜色
    const imageData = ctx.getImageData(0, 0, 200, 100);
    const leftData = imageData.data;
    let r = 0, g = 0, b = 0, count = 0;
    for (let i = 0; i < leftData.length; i += 4) {
      r += leftData[i];
      g += leftData[i + 1];
      b += leftData[i + 2];
      count++;
    }
    r = Math.floor(r / count);
    g = Math.floor(g / count);
    b = Math.floor(b / count);
    const brightness = r * 0.299 + g * 0.587 + b * 0.144;
    const textColor = brightness > 128 ? "rgba(0, 0, 0,1)" : "rgba(255, 255, 255,1)";
    
    // 绘制水印
    ctx.font = "35px SimHei";
    ctx.fillStyle = textColor;
    ctx.fillText(text, 10, 50);
    ctx.fillText(currentTime, 10, 100);
    let result = canvas.toDataURL("image/jpeg", 0.5);
    return result; // 返回带水印的Base64图像
  };
  img.onerror = function() {
    alert("添加水印出错了~");
  };
};

1. 加载图像

var img = new Image();
img.src = base64;

首先,我们创建一个Image对象,并通过base64格式的图像数据加载图片。base64是将二进制数据编码成ASCII字符的一种方式,常用于图像数据传输和嵌入。

2. 创建Canvas并设置大小

var canvas = document.getElementById("myCanvas");
canvas.width = img.width;
canvas.height = img.height;

通过document.getElementById获取一个HTML中的Canvas元素。随后,我们将Canvas的宽高设置为图片的宽高,以确保图像能够完整地绘制在Canvas中。

3. 绘制图片到Canvas

var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);

接下来,使用Canvas的drawImage方法将加载的图片绘制到Canvas上。ctx.getContext('2d')方法用于获取Canvas的绘图上下文(2D),然后通过ctx.drawImage将图像绘制到画布的指定位置。

水印图片怎么添加__然后添加水印

4. 计算图片左上角颜色亮度

const imageData = ctx.getImageData(0, 0, 200, 100);
const leftData = imageData.data;
let r = 0, g = 0, b = 0, count = 0;
for (let i = 0; i < leftData.length; i += 4) {
  r += leftData[i];
  g += leftData[i + 1];
  b += leftData[i + 2];
  count++;
}

为了动态选择水印的颜色,我们通过getImageData方法获取Canvas上的一个区域像素数据。在此代码中,我们选择了Canvas左上角的200x100像素区域,并计算这些像素的RGB值的平均值,以估算图像的亮度。

5. 计算亮度并决定水印颜色

const brightness = r * 0.299 + g * 0.587 + b * 0.144;
const textColor = brightness > 128 ? "rgba(0, 0, 0,1)" : "rgba(255, 255, 255,1)";

通过公式计算出图像的亮度值。为了简单地判断背景色是亮色还是暗色,我们使用了加权平均亮度公式。若亮度大于128,则选择黑色字体;否则,选择白色字体。

6. 绘制水印文字

ctx.font = "35px SimHei";
ctx.fillStyle = textColor;
ctx.fillText(text, 10, 50);
ctx.fillText(currentTime, 10, 100);

此处我们设置了水印文字的字体和大小(35px,使用SimHei字体)。然后,使用fillText方法分别绘制水印的姓名和当前时间,指定了文字的起始坐标。

7. 输出带水印的图像

let result = canvas.toDataURL("image/jpeg", 0.5);
return result;

最后,通过toDataURL方法将Canvas的内容转化为Base64编码的JPEG图片,并设置质量为0.5,返回带有水印的图像数据。

三、总结

通过HTML5的Canvas API,我们能够灵活地为图片添加水印,本文展示的代码为基础的水印添加方案,大家可以根据实际需求进一步扩展功能,如支持动态字体、透明度控制、多个水印等。


上一条 查看详情 +没有了
下一条 查看详情 +没有了