當使用canvas繪製網絡圖片的時候,常常會出現「Tainted canvases may not be exported」報錯,上網搜一下解決方案,應該給的都是給img添加crossOrigin屬性,嘗試了一下,確實可用。
看下面的一個例子:
html代碼:javascript
<canvas id="canvas" style="display: none"></canvas> <img id="canvasImg" />
javascript代碼:html
var img = new Image(); img.setAttribute('crossOrigin', 'anonymous'); var canvas = document.getElementById("canvas"); var ctx = canvas.getContext('2d'); img.onload = function () { canvas.width = img.width; canvas.height = img.height + 200; ctx.drawImage(img, 0, 0); document.getElementById('canvasImg').src = canvas.toDataURL("image/jpeg", 1); } img.src = 'http://img.hb.aicdn.com/38d8f519b3f464a80d85ed9632fed904ed0181f41d632-ZHrigO_fw658';
這樣就能夠正常畫出圖片了。java
可是我發現這個方法用於繪製微信頭像的時候有機率會出現問題,固然了這裏面指的是將圖片的網絡地址直接賦值給圖片的src。【之因此說有機率會出現問題是由於我經過上面的方法去完成需求的時候並無畫出頭像(微信頭像放在wx.qlogo.cn域名下,然而我今天準備寫這篇文章的時候忽然就能夠了,見鬼
當時的時候咱們找了不少方法,發現,在頭像url後面加上時間戳的話就能夠了【emmm神操做
即:json
img.src = 'http://wx.qlogo.cn/mmopen/vi_32/RnLIHfXibgFHlticiclzflpriaLsC3TS9b2Sbj05Wh3vGlhcFutt18dfkXGUt8x11e4q2KHlX4EHHaBb6XylLQW1kQ/0?timeStamp='+new Date();
今天找了個新的方法去解決canvas圖片跨域的問題:
將文件讀入到blob文件對象,而後使用URL.createObjectURL轉換成src可用的地址canvas
//直接讀成blob文件對象 function getImageBlob (url, cb) { var xhr = new XMLHttpRequest(); xhr.open('get', url, true); xhr.responseType = 'blob'; xhr.onload = function () { if (this.status == 200) { imgResponse = this.response; //這裏面能夠直接經過URL的api將其轉換,而後賦值給img.src //也可使用下面的preView方法將其轉換成base64以後再賦值 img.src = URL.createObjectURL(this.response); } }; xhr.send(); } //這裏面將blob轉換成base64 function preView (url) { let reader = new FileReader(); getImageBlob(url, function (blob) { reader.readAsDataURL(blob); }); reader.onload = function (e) { console.log(e.loaded) } } img.onload = function () { canvas.width = img.width; canvas.height = img.height + 200; ctx.drawImage(img, 0, 0); document.getElementById('canvasImg').src = canvas.toDataURL("image/jpeg", 1); } var imgResponse = ''; getImageBlob('http://wx.qlogo.cn/mmopen/vi_32/RnLIHfXibgFHlticiclzflpriaLsC3TS9b2Sbj05Wh3vGlhcFutt18dfkXGUt8x11e4q2KHlX4EHHaBb6XylLQW1kQ/0');