【问题标题】:'Tainted canvases may not be exported' when using drawImage [duplicate]使用drawImage时“可能无法导出受污染的画布” [重复]
【发布时间】:2016-01-17 23:48:27
【问题描述】:

尝试在画布上绘制图像,然后将画布保存到图像时,出现以下错误:

未捕获的安全错误:无法在“HTMLCanvasElement”上执行“toDataURL”:可能无法导出受污染的画布

var picture = new Image();
picture.src = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Smiley.svg/800px-Smiley.svg.png";
var canvas = document.getElementById("background");
var context = canvas.getContext("2d");
function generate(){
	var ctx = document.createElement("canvas").getContext("2d");
		ctx.canvas.width = canvas.width;
		ctx.canvas.height = canvas.height;
	ctx.fillStyle = "red";	
	ctx.rect (0, 0, 40, 40);
	ctx.fill();

	ctx.drawImage(picture,0,0);
	
	image = new Image();
	image.setAttribute('crossOrigin', 'anonymous');
	image.src = ctx.canvas.toDataURL("image/png");		
}
function draw(){
	context.clearRect(0, 0, canvas.width, canvas.height);
	context.drawImage(image, 0,0,100,100,0,0,100,100);	
}
function play(){
  generate();
  setInterval(function(){draw();}, 0.0333);
}

window.onload = function(){
	if(picture.complete)play();
	else picture.onload = play;	
}
<canvas id="background" width=500 height=500></canvas>

我知道这与在画布上绘制图像有关,因为删除该线后一切正常,您可以看到红色框:

var picture = new Image();
picture.src = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Smiley.svg/800px-Smiley.svg.png";
var canvas = document.getElementById("background");
var context = canvas.getContext("2d");
function generate(){
	var ctx = document.createElement("canvas").getContext("2d");
		ctx.canvas.width = canvas.width;
		ctx.canvas.height = canvas.height;
	ctx.fillStyle = "red";	
	ctx.rect (0, 0, 40, 40);
	ctx.fill();
	
	image = new Image();
	image.setAttribute('crossOrigin', 'anonymous');
	image.src = ctx.canvas.toDataURL("image/png");		
}
function draw(){
	context.clearRect(0, 0, canvas.width, canvas.height);
	context.drawImage(image, 0,0,100,100,0,0,100,100);	
}
function play(){
  generate();
  setInterval(function(){draw();}, 0.0333);
}

window.onload = function(){
	if(picture.complete)play();
	else picture.onload = play;	
}
<canvas id="background" width=500 height=500></canvas>
所以是 drawImage 导致这个失败。

我已经阅读了其他问题,解决方案是“只需添加 image.setAttribute('crossOrigin', 'anonymous');”(我已经完成)或将它们放在同一个目录中(我通过将两个文件都放在桌面上尝试过)但似乎都没有帮我解决。

是否有修复或替代方法?我想要做的就是将多个图像绘制到一个图像上。 (红框仅作展示。)

【问题讨论】:

    标签: javascript canvas


    【解决方案1】:

    我尝试将这两个文件都放在桌面上

    没有。您需要一个网络服务器并在http://(或https://)中打开您的文件,以便将它们视为同源。当您在 file:// 中打开文件时,即使您从同一目录提供它们,它们也不会被视为同一来源。

    【讨论】:

    • @dystroy。是的,在你的开发计算机上加载一个轻量级的 Web 服务器是有意义的。实际上,在开发过程中,您可以(通常)通过将网页代码(.html、.css、.js 等)与图像(.jpg、.png)一起放在桌面上来避免 CORS 错误。在此桌面“hack”中,您不会设置 image.crossOrigin 属性,否则 hack 会失败。 ;-)
    猜你喜欢
    • 2020-03-25
    • 2017-01-07
    • 2018-02-11
    • 2018-04-09
    • 2017-07-12
    • 2016-04-07
    • 2014-09-14
    • 2016-11-11
    • 2018-08-02
    相关资源
    最近更新 更多