toDataURL抛出Uncaught Security异常

abc*_*cba 5 javascript html5 canvas html5-canvas

我有两套用于测试html5画布的代码

第1集 - 完美地工作

<img id="preview" src="http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG">
<canvas id="myCanvas"/>

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var img = document.getElementById("preview");
ctx.drawImage(img, 10, 10);
alert(c.toDataURL());
Run Code Online (Sandbox Code Playgroud)

设置2 - 显示异常错误(未捕获的安全错误:无法在'HTMLCanvasElement'上执行'toDataURL':可能无法导出受污染的画布.)

<img id="preview1" src="http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG">

function getBase64() {
    var img = new Image();
    img =  document.getElementById("preview1");
    var canvas = document.createElement("canvas");
    canvas.width =img.width;
    canvas.height =img.width;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);
    var dataURL = canvas.toDataURL("image/png"); //This line of code will throw exception
    alert(  dataURL.replace(/^data:image\/(png|jpg);base64,/, "")); 
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么在Set 1 toDataURL中没有抛出任何异常,其中Set toDataURL将抛出异常并且两者都使用相同的图像集.不同的是在第一组我用HTML硬编码画布,第二组我通过javascript创建它.

我对Set 2代码的目标是获得图像的64个基本编码.

sha*_*rif 13

您可以使用crossOrigin属性.

var img= new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.src = url;
Run Code Online (Sandbox Code Playgroud)


Qan*_*avy 7

这是一个CORS问题 - Gravatar发送正确的标题,您只需要将正确的属性放入:

<img id="preview1" crossorigin="anonymous" src="http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG">

function getBase64() {
    var img = document.getElementById("preview1");
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.width;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);
    var dataURL = canvas.toDataURL("image/png");
    alert(dataURL.replace(/^data:image\/(png|jpg);base64,/, "")); 
}
getBase64();
Run Code Online (Sandbox Code Playgroud)

请注意,我测试它时,您的第一个示例也失败了,就像它应该的那样.

  • @abccba:奇怪,它在Chrome 30中对我不起作用. (3认同)