Chrome HTML5画布中的跨来源数据

mm5n2pyu  于 2023-03-10  发布在  Go
关注(0)|答案(6)|浏览(167)

我在js中加载一个图像并将其绘制到画布中,绘制完成后,我从画布中检索imageData:

var img = new Image();
img.onload = function() {
    canvas.drawImage(img, 0, 0);
    originalImageData = canvas.getImageData(0,0,width, height)); //chrome fails
}
img.src = 'picture.jpeg';

这在Safari和Firefox中都能完美运行,但在Chrome中失败,并显示以下消息:
无法从画布获取图像数据,因为画布已被跨源数据污染。
javascript文件和图像位于同一个目录中,所以我不理解chrome的行为。

hujrc8aj

hujrc8aj1#

要为图像启用CORS(跨源资源共享),请将HTTP标头与图像响应一起传递:

Access-Control-Allow-Origin: *

来源由网页的域和协议(例如http和https是不同的)而不是脚本的位置确定。
如果您使用file://在本地运行,这通常被视为跨域问题;所以最好是通过

http://localhost/
js5cn81o

js5cn81o2#

要解决file://的跨域问题,可以使用参数启动chrome

--allow-file-access-from-files
xmq68pz9

xmq68pz93#

var img = new Image();
img.onload = function() {
    canvas.drawImage(img, 0, 0);
    originalImageData = canvas.getImageData(0,0,width, height)); //chrome will not fail
}
img.crossOrigin = 'http://profile.ak.fbcdn.net/crossdomain.xml';//crossdomain xml file, this is facebook example
img.src = 'picture.jpeg';

希望这能帮上忙

3phpmpom

3phpmpom4#

var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.crossOrigin = "anonymous";
img.onload = function() {
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0);
  originalImageData = ctx.canvas.toDataURL();
}
img.src = 'picture.jpeg';

希望这个能帮上忙。

44u64gxh

44u64gxh5#

如果服务器响应标头包含Access-Control-Allow-Origin: *,则可以从客户端修复:为图像或视频添加属性。

<img src="..." crossorigin="Anonymous" />
<video src="..." crossorigin="Anonymous"></video>

否则,您必须使用服务器端代理。

7fyelxc5

7fyelxc56#

确保你是在提供本地文件而不是浏览它们。如果你在OSX上,你已经安装了Python服务器。只需在命令行中将cd导入你的网站目录,运行python -m SimpleHTTPServer,然后在浏览器中转到http://localhost:8000/
或者,您可以使用Node。运行npm install -g http-server,然后运行http-server。这将在端口8080上提供您的索引页,即浏览到http://localhost:8080/

相关问题