• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

Failed to execute ‘getImageData’ on ‘CanvasRenderingContext2D’ 问题解决方法

JAVA web前端中文站 2年前 (2018-02-14) 753次浏览 已收录 0个评论

最近在使用 Canvas 时,遇到了跨域问题。本文介绍如何解决这类跨域问题。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

具体的错误信息如下:

Uncaught DOMException: Failed to execute ‘getImageData’ on ‘CanvasRenderingContext2D‘: The canvas has been tainted by cross-origin data.

对于跨域的图片,只要能够在网页中正常显示出来,就可以使用 canvas 的 drawImage() API 绘制出来。但是如果你想更进一步,通过getImageData()方法获取图片的完整的像素信息,则多半会出错。

看下面的一个例子:

 var canvas = document.createElement('canvas'); 
 var context = canvas.getContext('2d'); 
 // web 前端中文站 www.lisa33xiaoq.net 
 var img = new Image(); 
 img.onload = function () {     
 context.drawImage(this, 0, 0);     
 context.getImageData(0, 0, this.width, this.height); }; 
 img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';

运行后,Firefox 浏览器错误为:

SecurityError: The operation is insecure.

那有没有什么办法可以解决这个问题呢?

在 HTML5 中,有些元素提供了支持 CORS(Cross-Origin Resource Sharing)(跨域资源共享)的属性,这些元素包括<img>,<video>,<script>等,而提供的属性名就是 crossOrigin 属性。

因此,上面的跨域问题可以这么处理:

 var canvas = document.createElement('canvas'); 
 var context = canvas.getContext('2d'); 
 // web 前端中文站 www.lisa33xiaoq.net 
 var img = new Image(); 
 img.crossOrigin = ''; 
 img.onload = function () {     
 context.drawImage(this, 0, 0);     
 context.getImageData(0, 0, this.width, this.height); }; 
 img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';

增加一个 img.crossOrigin = ”即可,虽然 JS 代码这里设置的是空字符串,实际上起作用的属性值是 anonymous。

crossOrigin 可以有下面两个值:

关键字 释义
anonymous 元素的跨域资源请求不需要凭证标志设置。
use-credentials 元素的跨域资源请求需要凭证标志设置,意味着该请求需要提供凭证。

其中,只要 crossOrigin 的属性值不是 use-credentials,全部都会解析为 anonymous,包括空字符串,包括类似’lisa33xiaoq.net’这样的字符。

例如:

 img.crossOrigin = 'lisa33xiaoq.net'; 
 console.log(img.crossOrigin);
 // 结果是'anonymous'

另外还有一点需要注意,那就是虽然没有 crossOrigin 属性,和设置 crossOrigin=”use-credentials”在默认情况下都会报跨域出错,但是性质上却不一样,两者有较大区别。

IE11+,Safari,Chrome,Firefox 浏览器均支持,IE9 和 IE10 会报 SecurityError 安全错误。

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Failed to execute ‘getImageData’ on ‘CanvasRenderingContext2D’ 问题解决方法
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址