Exc*_*ion 10 javascript google-chrome-extension html5-canvas
我使用下面的代码比较两个canvas元素
function createImage(html, can) {
var canvas = $( "#" + can );
var ctx = canvas[0].getContext("2d");
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='1000' height='1000'>" +
"<foreignObject width='100%' height='100%'>" +
"<div xmlns='http://www.w3.org/1999/xhtml'>" +
html +
"</div>" +
"</foreignObject>" +
"</svg>";
var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
img.crossOrigin = '';
var svg = new Blob([data], { type: "image/svg+xml;charset=utf-8" });
var url = DOMURL.createObjectURL(svg);
img.onload = function () {
ctx.drawImage(img, 0, 0);
DOMURL.revokeObjectURL(url);
};
img.src = url;
//return img.src;
return canvas[0];
}
var a1 = createImage("<span style='font-size:34px'><i><b>Hello</b></i></span>","can1");
var a2 = createImage("<span style='font-size:34px'><i><b>Hello</b></i></span>", "can2");
setTimeout(function() {
var ctx1 = a1.getContext('2d');
var imageData = ctx1.getImageData(0, 0, a1.width, a1.height);
var pixels = imageData.data;
var ctx2 = a2.getContext('2d');
var imageData2 = ctx2.getImageData(0, 0, a2.width, a2.height);
var pixels2 = imageData2.data, count;
for(var i = 0, il = pixels.length; i < il; i++) {
if(pixels[i] == pixels2[i]){
count++;
}
}
if(count === pixels.length && count === pixels2.length){
alert("Match");
}
},5000);
Run Code Online (Sandbox Code Playgroud)
但它正在返回我的错误如下
无法从画布获取图像数据,因为画布已被跨源数据污染.
我怎样才能摆脱这个错误?
您遇到跨源错误的原因是因为使用<svg>了名称空间声明http://www.w3.org/,其来源不同:
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='1000' height='1000'>" +
"<foreignObject width='100%' height='100%'>" +
"<div xmlns='http://www.w3.org/1999/xhtml'>" +
html +
"</div>" +
"</foreignObject>" +
"</svg>";
Run Code Online (Sandbox Code Playgroud)
我可以告诉这个方法是从绘制DOM对象到MDN上的画布.
当您以这种方式重新访问数据时,
var ctx1 = a1.getContext('2d');
var imageData = ctx1.getImageData(0, 0, a1.width, a1.height);
Run Code Online (Sandbox Code Playgroud)
你会遇到错误:
无法从画布获取图像数据,因为画布已被跨源数据污染.
您可以在Chrome上测试:
您只能从函数返回数据以避免出现此错误.但由于异步性质img.onload,
img.onload = function () {
ctx.drawImage(img, 0, 0);
DOMURL.revokeObjectURL(url);
};
Run Code Online (Sandbox Code Playgroud)
您必须推迟检索数据,强制您从函数中重新访问数据并导致错误.
因此,您应该使用另一种使用不依赖的DOM对象构建画布的方法<svg>,例如html2canvas.
function createImage(html) {
var dfd = new $.Deferred();
var el = document.createElement("div");
el.innerHTML = html;
el.style.display = 'inline-block';
document.body.appendChild(el);
html2canvas(el, {
onrendered: function(canvas) {
document.body.appendChild(canvas);
document.body.removeChild(el);
dfd.resolve(canvas.toDataURL());
}
});
return dfd;
}
$.when(
createImage("<span style='font-size:34px'><i><b>Hello</b></i></span>"),
createImage("<span style='font-size:34px'><i><b>Hello</b></i></span>")
).done(function(a1, a2){
if (a1 === a2) {
alert("Match");
}
});
Run Code Online (Sandbox Code Playgroud)
见DEMO.
| 归档时间: |
|
| 查看次数: |
2103 次 |
| 最近记录: |