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

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

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

瀏覽:234日期: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久久,三上悠亚国产精品一区二区三区
婷婷精品视频| 欧美精品影院| 欧美国产91| 欧美 日韩 国产一区二区在线视频 | 久久国产成人午夜av影院宅| 国产欧美高清视频在线| 婷婷成人av| 日韩福利视频网| 美国欧美日韩国产在线播放| 91精品国产福利在线观看麻豆| 中文字幕一区二区三区在线视频| 日韩高清不卡一区二区| 天堂av在线| 桃色一区二区| 国产在线欧美| 日韩午夜高潮| 亚洲一级影院| 中文字幕一区二区三区日韩精品| 亚洲午夜久久| 国产精品视频一区二区三区 | 国产日韩三级| 精品国产18久久久久久二百| 午夜影院一区| 99国产精品久久久久久久成人热 | 国产精品99久久免费| 久久精品一区| 吉吉日韩欧美| 99国产精品久久久久久久| 一二三区精品| 国产剧情在线观看一区| 国产伦久视频在线观看| 黄色亚洲大片免费在线观看| 青青草精品视频| 国产96在线亚洲| 一区二区三区视频免费观看| 亚洲日产av中文字幕| 欧美亚洲网站| 日韩中文字幕高清在线观看| 亚洲免费中文| 国产日产一区| av综合电影网站| 欧美精品黄色| 91亚洲无吗| 欧美天堂视频| 蜜臀a∨国产成人精品| 国产精品videossex久久发布| 日韩在线观看一区| 四虎在线精品| 久久亚州av| 在线亚洲自拍| 免费看久久久| 国产麻豆综合| 国内在线观看一区二区三区| 精品一区毛片| 欧美激情视频一区二区三区免费 | 老司机精品视频网| 国产精品99久久免费观看| 欧美日韩一区二区国产| 成人日韩av| 国产成人精品一区二区免费看京| 国产欧美日韩影院| 亚洲欧美日本视频在线观看| 蜜臀av免费一区二区三区| 欧美日韩国产v| 欧美精品国产| 欧美日韩国产高清电影| 欧美日本不卡高清| 美女网站一区| 欧美a级一区二区| 老牛国产精品一区的观看方式| 九九久久国产| 亚洲精品九九| 99久久www免费| 麻豆高清免费国产一区| 日本一区二区三区视频在线看| 欧美日韩色图| 欧美精品国产一区| 蘑菇福利视频一区播放| 伊人久久在线| 国产精品一区二区免费福利视频| 亚洲欧美日韩视频二区| 日韩免费小视频| 国产毛片精品| 一区二区三区国产在线| 国产精品av一区二区| 麻豆中文一区二区| 亚洲专区视频| 欧美日韩精品免费观看视频完整| 精品久久久久久久| 日韩精品免费视频人成| 99国产精品自拍| 红杏一区二区三区| 欧美啪啪一区| 石原莉奈在线亚洲三区| 99精品在线观看| 日韩精品dvd| 国产中文字幕一区二区三区| 91嫩草精品| 美美哒免费高清在线观看视频一区二区| 成人免费电影网址| 亚洲午夜天堂| 国产精品成人一区二区不卡| 国产日韩欧美三区| 日韩va亚洲va欧美va久久| 亚洲一区二区免费在线观看| 国产麻豆综合| 国模 一区 二区 三区| 麻豆理论在线观看| 精品美女久久| 精品国产精品久久一区免费式| 国产欧美一区二区三区米奇| 日韩国产一区二| 日本不卡在线视频| 97成人在线| 日本欧美一区| 日韩精品一级| 日韩黄色av| 欧美一级二级三级视频| 日韩精品视频网| 欧美日韩一区二区三区四区在线观看| 日本不卡不码高清免费观看| 综合国产视频| 免费观看久久久4p| 久色成人在线| 亚洲2区在线| 欧美在线日韩| 激情婷婷综合| 久久精品免费一区二区三区| 免费毛片在线不卡| av高清不卡| 久久久久免费| 久久在线91| 国产成人精选| 吉吉日韩欧美| 日韩久久一区二区三区| 久久精品福利| 在线国产精品一区| 美女尤物久久精品| 天堂va在线高清一区| 欧美有码在线| 欧美a级一区二区| 日韩国产一区| 九九色在线视频| 午夜影院一区| 精品成av人一区二区三区 | 亚洲婷婷免费| 91成人网在线观看| 一区二区自拍| 国产精品男女| 红桃视频亚洲| 精品在线网站观看| 日韩中文字幕91| 日本免费新一区视频| 一区在线免费| 精品欧美久久| 免费精品视频在线| 中文不卡在线| 婷婷成人在线| 精品日韩视频| 久久精品播放| 群体交乱之放荡娇妻一区二区| 成人国产精品久久| 日韩精品看片| 中文在线免费视频| 国产精品xxxav免费视频| 日韩1区2区3区| 国产精品xxx| av高清不卡| 欧美成人亚洲| 丝袜美腿亚洲一区| 成人va天堂| 色综合五月天| 久久av影视| 99国产精品| 久久亚洲影院| 日韩黄色av| 色吊丝一区二区| 亚洲午夜黄色| 国产精品香蕉| 免费在线小视频| 欧美一区三区| 女同性一区二区三区人了人一| 日韩av不卡一区二区| 日本va欧美va欧美va精品| 亚洲自拍另类| 日韩中文字幕一区二区高清99| 日韩精品亚洲专区| 国产欧美一区二区色老头| 久久不卡国产精品一区二区| 99成人在线视频| 欧美一区自拍| 日韩欧美午夜| 亚洲精品成人一区| 日韩av在线播放网址| 免费在线欧美视频| 麻豆国产欧美日韩综合精品二区| 欧美亚洲激情| 久久精品亚洲一区二区| 另类激情亚洲| 中文字幕在线视频网站|