【发布时间】:2023-03-26 01:27:02
【问题描述】:
您好,我有以下问题。
我正在生成 SVG 图像 (https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas)。
图像生成正确,看起来没问题。 现在我需要获取数据 URI,但每次我尝试从 canvas.toDataURL() 获取该信息时,都会出现此消息 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': 污染的画布可能无法导出。( …)
我创建了一些示例代码来说明这种情况。
</!DOCTYPE html>
<html>
<head>
<title>SVG to PNG</title>
</head>
<body>
<canvas id="canvas" style="border:2px solid black;" width="200" height="200">
</canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var data = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">' +
'<foreignObject width="100%" height="100%">' +
'<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:40px">' +
'<em>I</em> like ' +
'<span style="color:white; text-shadow:0 0 2px blue;">' +
'beer</span>' +
'</div>' +
'</foreignObject>' +
'</svg>';
var domURL = window.URL || window.webkitURL || window;
var img = new Image();
var svg = new Blob([data], {type: 'image/svg+xml'});
var url = domURL.createObjectURL(svg);
img.onload = function () {
ctx.drawImage(img, 0, 0);
domURL.revokeObjectURL(url);
var dataURL = canvas.toDataURL();
console.log(dataURL);
};
img.src = url;
</script>
</body>
</html>
此代码生成以下图像
这是正确的,但是当这些行被执行时
var dataURL = canvas.toDataURL(); console.log(dataURL);
它抛出错误。我在图像 onload 方法中执行此操作,以允许图像完成绘制到画布。如果我尝试从 onload 方法之外获取 dataURL,画布还没有完成加载,所以它会给我一个空图像。 我一直在寻找很多,但我还没有找到答案。这与 CORS 有关。我已经安装了 chrome 插件 CORS 并添加了 img,问题是这只是一个示例,基于 CORS 的解决方案没有用,因为我正在开发一个正在运行的应用程序在一个残缺不全的 chromium 浏览器上(我的意思是浏览器只显示网络应用程序,除了与应用程序交互之外,你不能在那里做任何事情)。
请注意,您可以使用
获取数据 URIinspect --> network --> 选择图片并在源面板中打开,这里就是复制图片作为数据 uri。 我以这种方式获得 base64 图像,如果我使用这样的解码器 (http://base64online.org/decode/),它会正确显示图像。 所以问题肯定是我在绘制画布之前获取了数据 URI。
有什么想法吗?
提前致谢!
问候
毛罗
【问题讨论】:
-
什么是“污染”的画布?尽管您可以在画布中使用未经 CORS 批准的图像,但这样做会污染画布。一旦画布被污染,您就不能再将数据拉出画布。例如,您不能再使用画布的 toBlob()、toDataURL() 或 getImageData() 方法;这样做会引发安全错误。 This protects users from having private data exposed by using images to pull information from remote web sites without permission
-
@TimVermaelen,这里不涉及跨域...
-
只是想知道什么是受污染的画布。因此,斜体描述接近于你不能做你正在尝试的事情的原因。
标签: javascript image canvas svg