很久之前寫過一篇關於 canvas 的文章,是通過 canvas 來實現一個絢麗的動畫效果,不管看過沒看過的小伙伴都可以直接猛戳下面的鏈接直達這篇文章哦!
因為之前很多篇都是偏向理論的,所以這次決定上點實際的內容——通過 canvas 為圖片添加自定義水印,並且在文章末尾也會附上源碼。下面進入正文~~~
添加水印的原理
原理很簡單,主要分為下面幾步
- 將需要添加水印的圖片繪制到 canvas 上
- 將水印圖片繪制到 canvas 上
- 將 canvas 的內容導出為圖片
使用到的 canvas 的 api
// 獲取當前 canvas 的上下文環境,用來操作在 canvas 上繪制內容
//
const ctx = canvas.getContext('2d')
// 向 canvas 上繪制圖片
// image 為一個圖片對象
// x 為繪制圖片的橫向起始位置,y 為繪制圖片的縱向起始位置
// width 為要繪制在 canvas 上寬度, height 為高度
// 該方法最多可接受 9 個參數,從而實現剪裁的效果,但是與本篇內容無關,感興趣的小伙伴可以搜索該方法
ctx.drawImage(image, x, y, width, height)
// 將 canvas 上的內容導出為 base64 格式的字符串,導出后可以直接賦值給 Image 對象的 src 屬性
// 第一個參數為導出的圖片格式,可接受第二個參數(小於或等於 1 的數,表示導出圖片的壓縮比率)
canvas.toDataURL("image/png")
其他要點
如果是通過鏈接獲取的圖片和水印,那么需要在繪制水印圖片之前,先將兩張素材圖片加載完成,由於圖片的加載時異步的,所以務必在確保圖片已經成功加載后才可以開始添加水印
demo 最終的實現效果

可以看到每張圖片的右下角都有一張小的水印圖片
demo 中的添加水印的類可以單獨使用,自定義的配置有如下幾項:
- 水印圖片路徑
- 水印添加位置:目前支持 9 種位置,分別是 左上角 | 右上角 | 左下角 | 右下角 | 頂部水平居中 | 底部水平居中 | 左邊垂直居中 | 右邊垂直居中 | 水平垂直居中(默認位置)
- 水印位置與圖片邊緣的距離:默認 10px,在水平垂直居中時無效
- 水印與圖片的寬度比:用來保證不管在多大的圖片上都能達到相同的顯示效果
該類可以同時為多張圖片添加水印,但是只有當之前的多張圖片全部完成添加后,才可以設置更多需要添加水印的圖片
兼容性
該類使用 ES6 編寫,且使用到了defineProperty()來監聽狀態的變動,所以不兼容 IE 的舊版瀏覽器,主流瀏覽器都可以使用
使用方式

具體的使用方式可以在 demo 的 watermark.js 中看到,源碼中有完善的注釋,整個方法加上注釋只有 306 行,想要閱讀源碼的小伙伴也可以很輕松的讀完
源碼將在文章末尾貼出
使用過程中出現 bug 怎么辦?
一旦出現 bug,請立即在文下評論,或者直接私信我都是沒問題噠!因為這個 demo 是周二晚上寫的,時間匆促,雖然已經極力避免出現問題,但如果真的出現了問題,還請各位小伙伴能夠諒解。只要你指出,我一定盡快修復。當然如果你願意自己動手修復 bug,那也是極好的!
如果你對源碼有任何理解不了的地方,也歡迎你評論或者私信我哦!
如果你想添加文字水印或文字圖片組合水印,也可以試着修改源碼,通過 canvas 的繪制文字 api 來實現哦!
最后,關門放...
代碼結構截圖
代碼文件截圖

運行方式
下載后,需要將文件放到一個http 服務器中,然后啟動http服務,來訪問
訪問如下圖所示:

神奇的canvas——巧用 canvas 為圖片添加水印
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權
