0

因此,您通过文件输入选择图像,所选图像文件将被转换为 window.url.createobjecturl 并未经修改地传递给隐藏的“img”元素,然后将图像元素当前数据的预览呈现到画布元素中. 到目前为止,一切都很好。但是当我尝试渲染 canvas.toDataURL 时,我不断收到关于它不安全的严重安全异常。这发生在 chrome 和 firefox 上。

了解这是一个使用 html INPUT 元素而不是通过“file://” url 选择的文件 OBJECT,并且该网页是一个实际网页,并且通过“http://”而不是通过“文件://”。

图像文件甚至还没有离开浏览器去服务器,所以不应该有任何域问题。它只是一个原始 blob 被断言为图像的源,然后它告诉画布更新其预览,它确实这样做了。之后,当尝试保存画布内容时,浏览器会触发错误。

我已经阅读了有关画布元素被污染的场景的所有规范,并且这种场景不符合任何这些场景。

我在 Mozilla 演示中看到了一个类似的示例,该示例提供代码片段来向人们展示如何做同样的事情,但我还没有看到是否有人遇到过问题。

有任何想法吗?TIA

#

=== 更新 ===

#

好的,我已经弄清楚问题是什么,但我仍然不清楚为什么会出现问题。这是设置:

1) 页面通过例如“example.com/”调用

2) 脚本通过以下方式调用:“r.example.com/script.js”

3)如果脚本从“r.example.com”加载任何图像,用于页面设计,而不是画布,它会污染整个页面。在这种情况下,我通过 javascript 绘制整个页面,因此标题图像污染了页面的其余部分。如果我将标题图像更改为来自“example.com”而不是“r.example.com”,那么抱怨不安全的画布问题就会消失,一切都很好。

我不明白为什么会这样。标题图像是从与 javascript 文件相同的位置加载的,并且,为了论证,我什至将主域和子域的 access-control-allow-origin 设置为“*”,这使得没有区别。

因此,允许从任何地方进行访问控制,标题图像来自与 javascript 文件相同的位置,并且它没有被绘制到画布(这是一个用户文件),那么为什么通过 javascript 绘制标题图像会污染 a与它无关的画布???此外,css 和其他媒体是从同一个子域加载的,但这不会影响页面,只要脚本没有加载它们 [o_0]。

我想将我的所有资源保存在一个单独的子域中以实现可扩展性,所以,这个问题令人沮丧,因为我不太明白为什么它仍然会发生......

4

2 回答 2

1

如果您希望您的图像位于单独的子域上,则必须更改图像的来源以允许所有子域,如下所示:

img .origin = '*.mydomain.com'

我正在使用带有 kineticJS 的画布,并且自己进行了测试。

于 2013-01-29T20:10:30.223 回答
0

看来您必须在图像对象本身上设置此属性,因为它最初没有域 [o_0]

img.origin = 'mydomain.com'
于 2012-10-28T14:19:45.927 回答