圖片跨域題目的平常處理要領
當運用canvas繪製收集圖片的時刻,常常會湧現“Tainted canvases may not be exported”報錯,上網搜一下處理方案,應當給的都是給img增加crossOrigin屬性,嘗試了一下,確切可用。
看下面的一個例子:
html代碼:
<canvas id="canvas" style="display: none"></canvas>
<img id="canvasImg" />
javascript代碼:
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';
如許就能夠一般畫出圖片了。
微信圖片的題目
然則我發明這個要領用於繪製微信頭像的時刻有幾率會湧現題目,固然了這內里指的是將圖片的收集地點直接賦值給圖片的src。【之所以說有幾率會湧現題目是因為我經由過程上面的要領去完成需求的時刻並沒有畫出頭像(微信頭像放在wx.qlogo.cn域名下,但是我本日預備寫這篇文章的時刻倏忽就能夠了,見鬼
當時的時刻我們找了許多要領,發明,在頭像url背面加上時候戳的話就能夠了【emmm神操縱
即:
img.src = 'http://wx.qlogo.cn/mmopen/vi_32/RnLIHfXibgFHlticiclzflpriaLsC3TS9b2Sbj05Wh3vGlhcFutt18dfkXGUt8x11e4q2KHlX4EHHaBb6XylLQW1kQ/0?timeStamp='+new Date();
其他的解法
本日找了個新的要領去處理canvas圖片跨域的題目:
將文件讀入到blob文件對象,然後運用URL.createObjectURL轉換成src可用的地點
//直接讀成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');