【发布时间】:2011-12-30 19:03:19
【问题描述】:
为了正确回答this question,我想我会:
- 将文档内 SVG 文件转换为数据 URL
- 将其加载到
<img> - 将
<img>画成<canvas> - 将
<canvas>转换为 PNG 数据 URL - 将该数据 URL 加载到图像中。
我在这里有一个这种尝试的例子:
http://phrogz.net/SVG/svg_to_png.xhtml
在 Firefox 中,我在第 3 步中尝试将图像绘制到画布上时收到 (NS_ERROR_NOT_AVAILABLE) [nsIDOMCanvasRenderingContext2D.drawImage]。
为什么我会在 Firefox 中收到此错误,或者我该如何解决?
在 Chrome 中,当我尝试在第 4 步中调用 toDataURL() 时,出现 SECURITY_ERR 异常。
为什么我会在 Chrome 中收到此错误,或者我该如何解决?
WhatWG specs 声明“从数据生成:在另一个文档或脚本中找到的 URL”的图像的来源来源应该与该文档相同。本次测试中的所有数据均来自同一个文档。
【问题讨论】:
-
如果您使用 SVG 文件,是否会遇到同样的错误(在 Chrome 中)?有可能经过这么多级别的复制,Chrome 已经无法确定来源了?
-
@BrianNickel 好问题。奇怪的是,是的。如果我将最后一行更改为
svgImg.src = "smiley.svg",那么尽管从同一域加载图像,它仍然会引发错误。这值得进一步调查;也许 SVG 数据 URL 是一个红鲱鱼。 -
我认为 svg 是问题所在:jsfiddle.net/eGjak/212。如果你绘制画布本身的数据 URL,它可以在 Chrome 上工作,但 SVG 的数据 URL 不能。
-
@pimvdb 你是对的; IRC 上的“Chrome 工程师”刚刚证实,将任何 SVG 绘制到 Canvas 当前会污染画布,无论 SVG 来源如何。由于围绕 SVG/
foreignObject的严重安全问题,这被描述为“平局”。 (在解决 Firefox 问题之前,不要将此作为答案发布。) -
另请参阅stackoverflow.com/questions/3975499 了解解决方法
标签: javascript html canvas svg