在沒有微信之前我們很多小伙伴們應該都是使用QQ吧!那么隨著技術的發(fā)展越來越多的人使用微信人們可以把自己的見聞和心情發(fā)到上面,那么這次我們就來說說有關于:“怎么使用html5中的canvas對多圖片拼合并導出圖片?”這個問題吧!
先說下canvas繪圖的基本方法,如下:
const myCanvas = document.createElement('canvas');
myCanvas.width = 400;
myCanvas.height = 400;
const ctx = myCanvas.getContext('2d');
const img = new Image();
img.src = "1.jpg";
//當圖片加載完畢的時候在drawImage,否則可能圖片還沒有加載完畢
img.onload=()=>{
ctx.drawImage(img, 0, 0, 100, 50);
}
語法:
?drawImage(image, x, y)
?
以 canvas 上指定的坐標點開始,按照圖像的原始尺寸大小繪制整個圖像。
?drawImage(image, x, y, width, height)
?
以canvas上指定的坐標點開始,以指定的大小(?width
?和?height
?)繪制整個圖像,圖像會自動縮放。
?drawImage(image, imageX, imageY, imageWidth, imageHeight, x, y, width, height)
?
將指定圖像的局部圖像(以(?imageX
?, ?imageY
?)為左上角、寬度為?imageWidth
?、高度為?imageHeight
?的矩形部分)繪制到 canvas 中以?( x, y)
?為左上角坐標、寬度為?width
?、高度為?height
?的矩形區(qū)域中
這次多圖拼合的業(yè)務場景是做不同內(nèi)容的定制分享圖片,用到的圖片元素有,背景圖片、外鏈圖片、網(wǎng)站logo、定制生產(chǎn)的二維碼圖,需要解決的問題,都是在畫布轉(zhuǎn)圖片輸出時產(chǎn)出的。主要有3點:
1、圖片的跨域問題;
2、繪制多圖,造成的畫布污染;
3、圖片的大小;
首先圖片的跨域問題,這個問題在網(wǎng)上已經(jīng)有很多相關信息,解決辦法如下:
img.setAttribute('crossOrigin', 'anonymous');
當解決完跨域問題后,在多圖拼合導出后,出現(xiàn)了新的報錯信息:
Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted Canvases may not be exported.
我發(fā)現(xiàn)這個問題時,查看網(wǎng)上的資料,大多也是用上面的跨域方法解決的,可是我明顯在我的業(yè)務場景里是不管用的。
通過對代碼的排查,我發(fā)現(xiàn),背景圖+二維碼圖時,并不會報這個錯誤,如外鏈圖片做了跨域處理,單獨使用時,也不會報錯。而logo圖片都是本地的文件,顯然不應該是跨域問題。
那么二維碼圖和背景圖能夠不出錯的原因,應該在于二維碼圖片源是base64格式的。
于是,我試著將 logo 圖使用畫布導出 base64 格式,然后和背景圖+二維碼圖進行拼合,導出時果然沒再報錯。
所有解決多圖拼合導出時,Tainted Canvases 的問題,應該是將圖片元素做成 base64 的格式,就能夠避免了。
因為我的業(yè)務場景中有外鏈圖片,而且不是所有的外鏈都對我網(wǎng)站域名做了跨域允許的處理,所以,在生成外鏈圖片的 base64 數(shù)據(jù)時,可是使用 img.onerror 事件的處理,用缺省圖替換。
因為有在畫總圖之前,有對多圖的分別處理,因此,使用 Promise 處理可能會更好一些。
在圖片導出的大小問題上,導出時盡量使用
myCanvas.toDataURL('image/jpeg', encoderOptions)
encoderOptions:可以從0到1的區(qū)間內(nèi)選擇圖片的質(zhì)量。如果超出取值范圍,將會使用默認值 0.92。其他參數(shù)會被忽略。
通過這篇文章相信大家對于:“怎么使用html5中的canvas對多圖片拼合并導出圖片?”這個問題也有所了解了,當然如果在html5中可以實現(xiàn)的內(nèi)容當然不知如此了,更多的相關內(nèi)容和知識我們都可以W3Cschool中進行學習和了解。 那么今天的分享就到這邊,希望對大家的學習和了解有所幫助!