HTML5+Canvas實(shí)現(xiàn)圖片添加水印功能
在現(xiàn)代Web開發(fā)中,圖像處理是一個(gè)常見的需求,尤其是為圖片添加水印。水印常用于標(biāo)記圖像的版權(quán)、出處或時(shí)間信息等。本文將詳細(xì)介紹如何使用HTML5的Canvas技術(shù)為圖片添加水印,講解代碼實(shí)現(xiàn)的每一個(gè)細(xì)節(jié),幫助大家理解整個(gè)過程,并且能夠靈活運(yùn)用。
一、HTML5 Canvas概述
Canvas是HTML5新增的一個(gè)元素,它提供了一個(gè)用于動(dòng)態(tài)生成圖像的畫布環(huán)境。通過JavaScript,我們可以在Canvas上繪制圖形、文本或圖像。Canvas非常適合處理圖像編輯、圖形繪制、動(dòng)畫等任務(wù)。
Canvas的基本用法:
- 創(chuàng)建Canvas元素:通過HTML中定義
<canvas>
標(biāo)簽。 - 獲取Canvas上下文:Canvas的繪圖操作都是基于其上下文進(jìn)行的。通過
getContext('2d')
可以獲取一個(gè)2D繪圖上下文對(duì)象,進(jìn)而執(zhí)行各種繪圖操作。 - 繪制操作:包括繪制圖像、矩形、圓形、路徑等。
二、實(shí)現(xiàn)代碼分析
接下來,我們對(duì)代碼進(jìn)行詳細(xì)的分析,逐步理解每一部分的功能和實(shí)現(xiàn)方式。
function addMark(base64, text, currentTime) { var img = new Image(); img.src = base64; img.onload = function() { // 準(zhǔn)備canvas環(huán)境 var canvas = document.getElementById("myCanvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); // 繪制圖片 ctx.drawImage(img, 0, 0); // 識(shí)別左上角顏色 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("添加水印出錯(cuò)了~"); }; };
1. 加載圖像
var img = new Image(); img.src = base64;
首先,我們創(chuàng)建一個(gè)Image
對(duì)象,并通過base64
格式的圖像數(shù)據(jù)加載圖片。base64
是將二進(jìn)制數(shù)據(jù)編碼成ASCII字符的一種方式,常用于圖像數(shù)據(jù)傳輸和嵌入。
2. 創(chuàng)建Canvas并設(shè)置大小
var canvas = document.getElementById("myCanvas"); canvas.width = img.width; canvas.height = img.height;
通過document.getElementById
獲取一個(gè)HTML中的Canvas元素。隨后,我們將Canvas的寬高設(shè)置為圖片的寬高,以確保圖像能夠完整地繪制在Canvas中。
3. 繪制圖片到Canvas
var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0);
接下來,使用Canvas的drawImage
方法將加載的圖片繪制到Canvas上。ctx.getContext('2d')
方法用于獲取Canvas的繪圖上下文(2D),然后通過ctx.drawImage
將圖像繪制到畫布的指定位置。
4. 計(jì)算圖片左上角顏色亮度
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++; }
為了動(dòng)態(tài)選擇水印的顏色,我們通過getImageData
方法獲取Canvas上的一個(gè)區(qū)域像素?cái)?shù)據(jù)。在此代碼中,我們選擇了Canvas左上角的200x100像素區(qū)域,并計(jì)算這些像素的RGB值的平均值,以估算圖像的亮度。
5. 計(jì)算亮度并決定水印顏色
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)";
通過公式計(jì)算出圖像的亮度值。為了簡(jiǎn)單地判斷背景色是亮色還是暗色,我們使用了加權(quán)平均亮度公式。若亮度大于128,則選擇黑色字體;否則,選擇白色字體。
6. 繪制水印文字
ctx.font = "35px SimHei"; ctx.fillStyle = textColor; ctx.fillText(text, 10, 50); ctx.fillText(currentTime, 10, 100);
此處我們?cè)O(shè)置了水印文字的字體和大?。?5px,使用SimHei
字體)。然后,使用fillText
方法分別繪制水印的姓名和當(dāng)前時(shí)間,指定了文字的起始坐標(biāo)。
7. 輸出帶水印的圖像
let result = canvas.toDataURL("image/jpeg", 0.5); return result;
最后,通過toDataURL
方法將Canvas的內(nèi)容轉(zhuǎn)化為Base64編碼的JPEG圖片,并設(shè)置質(zhì)量為0.5,返回帶有水印的圖像數(shù)據(jù)。
三、總結(jié)
通過HTML5的Canvas API,我們能夠靈活地為圖片添加水印,本文展示的代碼為基礎(chǔ)的水印添加方案,大家可以根據(jù)實(shí)際需求進(jìn)一步擴(kuò)展功能,如支持動(dòng)態(tài)字體、透明度控制、多個(gè)水印等。
到此這篇關(guān)于HTML5+Canvas實(shí)現(xiàn)圖片添加水印功能的文章就介紹到這了,更多相關(guān)HTML5 Canvas圖片添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript對(duì)象屬性設(shè)置和屏蔽技巧
這篇文章主要為大家介紹了JavaScript對(duì)象屬性設(shè)置和屏蔽技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02webpack構(gòu)建vue項(xiàng)目的詳細(xì)教程(配置篇)
本篇文章主要介紹了webpack構(gòu)建vue項(xiàng)目的詳細(xì)教程(配置篇),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07通過JavaScript實(shí)現(xiàn)撲克牌游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript如何通過面向?qū)ο髮?shí)現(xiàn)一個(gè)簡(jiǎn)單的撲克牌游戲,文中的示例代碼代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-07-07一款JavaScript壓縮工具:X2JSCompactor
一款JavaScript壓縮工具:X2JSCompactor...2007-06-06微信小程序 MinUI組件庫(kù)系列之badge徽章組件示例
這篇文章主要介紹了微信小程序 MinUI組件庫(kù)系列之badge徽章組件示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08js如何調(diào)用qq互聯(lián)api實(shí)現(xiàn)第三方登錄
這篇文章主要介紹了js如何調(diào)用qq互聯(lián)api實(shí)現(xiàn)第三方登錄,需要的朋友可以參考下2014-03-03JavaScript 操作table,可以新增行和列并且隔一行換背景色代碼分享
這篇文章介紹了JavaScript操作table,可以新增行和列并且隔一行換背景色代碼,有需要的朋友可以參考一下2013-07-07