THREE.js:跨域资源共享策略拒绝跨域图像加载

Posted

技术标签:

【中文标题】THREE.js:跨域资源共享策略拒绝跨域图像加载【英文标题】:THREE.js: Cross-origin image load denied by Cross-Origin Resource Sharing policy 【发布时间】:2013-12-08 12:37:09 【问题描述】:

我的 Chrome 版本是 31.0.1650.57

我正在学习 THREE.js 并从https://github.com/jeromeetienne/threex.planets/下载了一个行星样本

但是当我运行 earth.html

正如标题所说,发生了一个奇怪的错误:

THREE.WebGLRenderer 59 three.min.js:424
Cross-origin image load denied by Cross-Origin Resource Sharing policy. earth.html:1
Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': the canvas has been tainted by cross-origin data. threex.planets.js:73
(anonymous function) threex.planets.js:73

我查看了代码并找到了可能与此错误有关的内容:

THREEx.Planets.baseURL  = '../'
...
map: THREE.ImageUtils.loadTexture(THREEx.Planets.baseURL+'images/earthmap1k.jpg'),

但我不知道如何解决它,我对 javascript 比较陌生,

希望有人能帮助我!

非常感谢!

【问题讨论】:

github.com/mrdoob/three.js/wiki/How-to-run-things-locally 这有帮助吗?您需要一个本地服务器来在本地运行纹理加载示例... 是的,我已经通过使用 Node.js 运行本地服务器解决了这个问题,非常感谢! 【参考方案1】:

这样的事情应该可以解决它。

var imageObj = new Image()
imageObj.onload = function()
 THREE.ImageUtils.loadTexture(imageObj)
 // or maybe load image into canvas?

imageObj.crossOrigin="anonymous"
imageObj.src = THREEx.Planets.baseURL+'images/earthmap1k.jpg'

【讨论】:

您能否为您的答案提供一些背景信息,以便未来的读者可以学习如何将其应用于他们的问题,而不仅仅是在这种情况下。我还强烈建议您阅读***.com/help/how-to-answer,使用该链接作为参考可以极大地提高您的答案的可见性和清晰度。【参考方案2】:

我知道这个问题是你需要在 服务器环境 中运行你的项目或 Three.js 示例,就像上面的答案在 nodejs 或 Appserv 这些本地服务中运行你的代码

【讨论】:

【参考方案3】:

在您的图像标签中使用crossOrigin="anonymous",如下所示。

<img src="SOMETHING" crossOrigin="anonymous" />

【讨论】:

不幸的是,这不适用于通过 javascript 加载图像。这就是 WebGL 通过 javascript 加载图像时的工作原理。【参考方案4】:

我通过安装 Node.js 并运行本地服务器来打开这个 html 解决了这个问题!

【讨论】:

【参考方案5】:

您是在本地文件系统上运行它(双击 html 文件)还是在 Web 服务器上运行它?如果你在 web 服务器上运行它,你应该避免跨域权限问题。 (这是 Chrome 等浏览器的安全功能。)

【讨论】:

以上是关于THREE.js:跨域资源共享策略拒绝跨域图像加载的主要内容,如果未能解决你的问题,请参考以下文章

Safari 中的跨域资源共享策略拒绝了跨域重定向

跨域共享策略 - 在 Chrome 上使用 color-thief.js 加载颜色

浏览器画布 CORS 支持跨域加载图像操作

关于Jsonp 跨域

同源策略和跨域资源共享

到底什么是跨域?附解决方案!