日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JS前端基于canvas給圖片添加水印

瀏覽:230日期:2024-04-12 16:44:11

前兩天給個人網站添加了一個小功能,就是在文章編輯上傳圖片的時候自動給圖片加上水印。給網頁圖片添加水印是個常見的功能,也是互聯網內容作者保護自己版權的方法之一。本文簡單記錄一下借助canvas在前端實現圖片添加水印的實現方法。canvas元素其實就是一個畫布,我們可以很方便地繪制一些文字、線條、圖形等,它也可以將一個img標簽里渲染的圖片畫在畫布上。

在上傳文件到后端的時候,使用input標簽讀取用戶本地文件后得到的其實是一個Blob對象(更精確的說是File對象,特殊的Blob對象);而在頁面上展示一個圖片使用的是img標簽;繪制功能用canvas實現。添加水印的功能需要在img標簽、canvas畫布、Blob對象這三者之間相互轉換,通過一些API可以完成這個工作:

JS前端基于canvas給圖片添加水印

我們可以從本地讀取圖片Blob,然后渲染到img標簽,使用canvas繪制img內容并且繪制水印內容到畫布,再將canvas內容轉為Blob對象上傳服務器,這樣就完整實現了圖片+水印的功能。

一、本地讀取圖像文件渲染到img標簽

本地讀取圖片文件將會得到一個Blob對象,我們可以借助FileReader.readAsDataURL方法讀取Blob的內容,并得到一個Base64編碼的文件內容,可以將該內容賦值給img.src從而在瀏覽器上渲染出本地的圖像。當然,img并非必須渲染到DOM樹。讀取操作是個異步操作,讀取完成會觸發load事件,為了便于之后的調用,我們可以用一個Promise包裝這個操作,最后返回一個Promise對象。

function blobToImg (blob) { return new Promise((resolve, reject) => { let reader = new FileReader() reader.addEventListener(’load’, () => { let img = new Image() img.src = reader.result img.addEventListener(’load’, () => resolve(img)) }) reader.readAsDataURL(blob) })}

二、將img標簽內容繪制到canvas畫布

調用canvas元素畫布上下文對象的drawImage方法即可實現將img內容繪制到畫布。

function imgToCanvas (img) { let canvas = document.createElement(’canvas’) canvas.width = img.width canvas.height = img.height let ctx = canvas.getContext(’2d’) ctx.drawImage(img, 0, 0) return canvas}

drawImage這個方法可以傳入多個參數,以定義繪制的圖像的范圍,這里傳入的0, 0定義從圖像左上角開始繪制,后面可以繼續傳入兩個參數來定義圖像的繪制終點,不過這里整個圖片都要繪制到canvas,所以采用默認值即可。

三、canvas畫布上繪制水印并轉換為Blob對象

在圖片上傳的時候,我們通常采用FormData,圖片文件以一個Blob對象的形式放到FormData中,所以我們需要把canvas再轉為Blob以便文件上傳等操作。利用HTMLCanvasElement.toBlob方法:

function watermark (canvas, text) { return new Promise((resolve, reject) => { let ctx = canvas.getContext(’2d’) // 設置填充字號和字體,樣式 ctx.font = '24px 宋體' ctx.fillStyle = '#FFC82C' // 設置右對齊 ctx.textAlign = ’right’ // 在指定位置繪制文字,這里指定距離右下角20坐標的地方 ctx.fillText(text, canvas.width - 20, canvas.height - 20) canvas.toBlob(blob => resolve(blob)) })}

四、圖片添加水印完整接口

將以上三個步驟結合起來,就完整地實現了從圖片添加水印,下面是一個簡單的使用示例:從本地選擇一個圖片文件,然后添加水印后,在傳入的dom元素下預覽添加水印后的圖片。

function imgWatermark (dom, text) { let input = document.createElement(’input’) input.setAttribute(’type’, ’file’) input.setAttribute(’accept’, ’image/*’) input.onchange = async () => { let img = await blobToImg(input.files[0]) let canvas = imgToCanvas(img) let blob = await watermark(canvas, text) // 此處將Blob讀取到img標簽,并在dom內渲染出來;如果是上傳文件,可以將blob添加到FormData中 let newImage = await blobToImg(blob) dom.appendChild(newImage) } input.click()}

給頁面加一個id為container的div元素,然后如下調用:

let dom = document.querySelector(’#container’)imgWatermark(dom, ’水印文字’)

這樣就完整地給圖片添加了水印效果,下面看一下實際效果,你也可以在線體驗。

添加水印前:

JS前端基于canvas給圖片添加水印

添加水印后(水印內容:“騰沖·清涼山”):

JS前端基于canvas給圖片添加水印

五、總結

本文僅僅介紹了圖像+水印文字的簡單實現,但是涉及的一些接口其實很有用。比如有時候遇到的一個功能是頭像上傳的預覽和剪裁,這時候你可以利用FileReader來讀取文件內容預覽,利用CanvasRenderingContext2D.drawImage來實現剪裁功能。關于本文涉及接口的更多詳細用法,可以參照MDN文檔,文章中的API都使用了鏈接的形式鏈接到了MDN。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
av高清不卡| 欧美13videosex性极品| 91视频久久| 国产情侣一区在线| 日本欧美大码aⅴ在线播放| 亚洲一区二区三区无吗| 中文在线免费视频| 欧美在线黄色| 精品国产乱码久久久久久1区2匹| 日本在线一区二区三区| 亚洲网址在线观看| 日欧美一区二区| 女人天堂亚洲aⅴ在线观看| 欧美日韩在线网站| 亚洲资源av| 中文字幕一区二区三区日韩精品| 综合色就爱涩涩涩综合婷婷| 亚洲三级精品| 久久国产生活片100| 免费欧美日韩| 一区二区国产在线观看| 狠狠操综合网| 视频一区欧美日韩| 日韩在线麻豆| 日本一区中文字幕| 国产精品主播| 精品日产乱码久久久久久仙踪林| 只有精品亚洲| 欧美午夜三级| 精品欧美一区二区三区在线观看| 超碰超碰人人人人精品| 午夜影院一区| 国产一区亚洲| 亚洲综合五月| 国产欧美日韩一级| 成人午夜网址| 日本va欧美va瓶| 亚洲毛片在线| 日韩国产综合| 麻豆91精品91久久久的内涵| 欧美aa国产视频| 久久久精品午夜少妇| 国产伦久视频在线观看| 最新亚洲国产| 亚洲高清影视| 蘑菇福利视频一区播放| 亚洲乱码久久| 成人午夜毛片| 日本va欧美va欧美va精品| 亚洲精品影视| 久久一区欧美| 国产精品99免费看| 日本久久二区| 成人羞羞视频播放网站| 视频一区视频二区中文字幕| 久久久久亚洲精品中文字幕| 欧美成人久久| 在线精品视频一区| 国产一区二区三区久久| 午夜欧美精品| 国产精品啊v在线| 国产在线不卡| 国产精品视频3p| 99视频精品| 美女av一区| 中文国产一区| 麻豆久久久久久| 国产一级久久| 日韩av片子| 日韩高清在线观看一区二区| 国产在线|日韩| 日韩高清在线不卡| 日韩免费小视频| 欧美亚洲福利| 伊人久久婷婷| 9999国产精品| 日韩不卡一二三区| 久久精品91| 欧美午夜三级| 午夜日韩福利| 丰满少妇一区| 日韩av中文在线观看| 99久久www免费| 国产精品成人一区二区网站软件| 91精品电影| 日韩成人精品一区| 欧美一区成人| 午夜一级久久| 美女福利一区二区三区| 欧美精品三级在线| 99在线精品免费视频九九视| 久久精品免视看国产成人| 日韩精品一二三四| 日韩理论片av| 国产精品嫩模av在线| 免费观看在线综合色| 99久久九九| 成人午夜毛片| 国产麻豆一区二区三区| 亚洲欧洲免费| 欧美在线亚洲综合一区| 国产精品国产一区| 欧美精品成人| 亚洲综合二区| 黑丝一区二区| 色老板在线视频一区二区| 国产激情在线播放| 国产乱码精品一区二区三区四区| 美女精品在线| 中文在线一区| jiujiure精品视频播放| 久久久久.com| 日韩精品第一区| 黄色在线网站噜噜噜| 国产精品成人国产| 国产精品免费99久久久| 欧美日韩伊人| 日韩激情av在线| 久久不射网站| 亚洲欧洲另类| 国产视频一区三区| 好吊日精品视频| 亚洲激情国产| 尤物在线精品| 一区二区自拍| 99国产精品视频免费观看一公开| 136国产福利精品导航网址| 成人免费电影网址| 97se综合| 99久久99久久精品国产片果冰| 日韩一区二区中文| 日韩精品中文字幕第1页| www.51av欧美视频| 精品亚洲免a| 国产精品不卡| 精品成人免费一区二区在线播放| 日韩精品一区二区三区免费观看| 日韩不卡在线| 亚洲精品91| 福利视频一区| 久久婷婷亚洲| 免费成人在线观看| 尤物在线精品| 老司机精品久久| 国产精品美女| 激情久久99| 日韩精品免费一区二区夜夜嗨 | 国产视频亚洲| 国产麻豆精品| 九九久久国产| 久久uomeier| 欧美日韩国产v| 免费欧美一区| 日韩一区精品视频| 色综合视频一区二区三区日韩| 亚洲男人在线| 国产日产一区| 国产成人精选| 亚洲天堂黄色| 尤物在线精品| 亚洲欧美高清| 国产欧美日韩影院| 久久97久久97精品免视看秋霞| 久久精品国内一区二区三区| 国产精品白丝一区二区三区| 国产中文字幕一区二区三区| 999久久久国产精品| 亚洲电影在线一区二区三区| 日韩一区免费| 久久一区精品| 一区视频在线| 久久国产尿小便嘘嘘| 欧美www视频在线观看| 红桃视频国产一区| 亚洲精品三级| 精品国产一区二区三区噜噜噜| 国产黄大片在线观看| 黄色精品网站| 国产精品观看| 欧美日韩色图| 国产欧美日韩| 久久久久美女| 国产亚洲欧美日韩在线观看一区二区 | 在线精品视频在线观看高清| 日韩三级一区| 精品视频免费| 亚洲欧美成人综合| 欧美激情精品| 好吊一区二区三区| 欧美午夜三级| 亚洲v在线看| 日韩精彩视频在线观看| 色乱码一区二区三区网站| 欧美中文日韩| 超碰在线99| 日韩国产欧美一区二区三区| 久久免费国产| 欧美中文高清| 99视频一区| 精品国产精品久久一区免费式 |