canvas 跨域问题如何解决?

html5 使用图像数据,在chrome浏览器出现跨域问题?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test Html5</title>
<style type="text/css">
*{margin: 0; padding: 0;}
.content {width: 1200px; margin: 0 auto; padding: 20px 0;}
 #canvas { border: 2px solid #333;}
 .img {width: 1200px; height: 800px; overflow: hidden;}
</style>
</head>
<body>
<div class="content">
    <canvas id="canvas">你的浏览器不支持canvas!!!</canvas>
    <div class="img"><img id="image" src="images/004.jpg" alt=""></div> 
</div>
</body>

<script type="text/javascript">
   window.onload = function(){
        var canvas  = document.getElementById("canvas"); //获取canvas
        canvas.width  = 1200;
        canvas.height = 600;
        var context = canvas.getContext('2d'); //获取2d上下文绘图环境
        var image = document.getElementById("image");
        context.drawImage(image,0,0,800,500); //x,y,wd,hg
        //使用图像数据
        
    var imageData = context.getImageData(0,0,800,800); //x y wd hg 
    var      data = imageData.data;
    console.log(data);
    for (var i = 0; i < data.length; i+=4) {
           red = data[i];
        green = data[i+1];
         blue = data[i+2];
        alpha = data[i+3];
          average = Math.floor((red+green+blue)/3);
          data[i]   = average;
          data[i+1] = average;
          data[i+2] = average;
     }
     imageData.data = data;
     context.putImageData(imageData,0,0);
    } 
    </script>
    </html>

chrome 控制台出现 Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
IEedge是好的,就是将彩色图片变成黑白图片图片描述
图片描述图片描述

  1. 相关问题canvas 跨域问题

  2. stackoverfow 上有相关提问 canvas CORS

  3. 看不懂stackoverflow解决办法 “To solve the cross domain issue with file://, you can start chrome with the parameter” --allow-file-access-from-files

  4. src= "images/004.jpg" 这也算跨域? 我对跨域的理解就是必须协议相同,域名一样,端口一样。

  5. 那么chrome 这个问题该如何解决,以后的解决跨域有没有一些好的方法?

阅读 37.1k
6 个回答

试试img.crossOrigin = "Anonymous";

因为你没在服务器浏览,所以报错了,
Canvas是不支持跨域的,改浏览器启动参数只是让自己电脑支持而已,解决不了真正的跨域问题

1.起个服务器再在chrome里试一下,应该会跑通。
2.右键chrome,属性,在目标后面加上(有个空格) --allow-file-access-from-files
这是改启动参数。大概是chrome的神秘本地文件限制吧。。既然有外国小哥教那最好了。

新手上路,请多包涵
新手上路,请多包涵

用browser-sync 同步显示网页 就可以了 (话说显示的那个图片是什么动漫 能给个原图吗)

测试验证结果:

触发条件:直接打开本地file,getImageData获取图片数据时报错

  1. 如果图片通过new Image的方式创建就会导致这个问题,即使设置了crossOrigin依然无用。
  2. 提前在html中写好img元素并设置好crossOrigin,然后通过document.querySelect(element)获取图片,会导致另一个错误。

clipboard.png

clipboard.png

解决办法:
通过node本地开启一个静态服务器

  1. npm install http-server -g
  2. http-server -p 8081
  3. 如图所示,开启成功后,E:\media就是你的项目根目录,可以随便访问了 localhost:8081/test.html

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏