在现代web开发中,图像处理是一个常见的需求,尤其是为图片添加水印。水印常用于标记图像的版权、出处或时间信息等。本文将详细介绍如何使用html5的canvas技术为图片添加水印,讲解代码实现的每一个细节,帮助大家理解整个过程,并且能够灵活运用。
一、html5 canvas概述
canvas是html5新增的一个元素,它提供了一个用于动态生成图像的画布环境。通过javascript,我们可以在canvas上绘制图形、文本或图像。canvas非常适合处理图像编辑、图形绘制、动画等任务。
canvas的基本用法:
- 创建canvas元素:通过html中定义
<canvas>
标签。 - 获取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,我们能够灵活地为图片添加水印,本文展示的代码为基础的水印添加方案,大家可以根据实际需求进一步扩展功能,如支持动态字体、透明度控制、多个水印等。
到此这篇关于html5+canvas实现图片添加水印功能的文章就介绍到这了,更多相关html5 canvas图片添加水印内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论