<img >加上crossOrigin="anonymous"之后导致图片无法显示

a653019151
  • 54

主要是想对跨域的图片进行裁剪保存
先是出现canvas.toDataURL()报错 网上资料说需要添加crossOrigin="anonymous"允许跨域
但加了之后图片就无法显示了 我又新建了一个页面发现 只要是<img>加了crossOrigin="anonymous"就都无法显示 求大神帮忙,谢谢。

clipboard.png

回复
阅读 68.5k
8 个回答

你从哪里找的答案。误人子弟啊,Access-C...A...O...字段是服务端添加了才有的,"响应头中就会附加"是什么鬼,你加了crossOrigin="anonymous"是表明你想跨域获取这张图片,好用在canvas.toDataURL()上,但是服务端不一定同意啊,服务端添加了access...这个字段并且value是*或者你网站的域名才行,否则就认为你无权用,结果就是无法显示
参考:
http://stackoverflow.com/ques...
https://developer.mozilla.org...
https://developer.mozilla.org...

跨域图片能正常裁剪(图片未转化成base64),应该满足三个条件:

  1. img元素中设置crossorigin属性
  2. 图片允许跨域,设置响应头Access-Control-Allow-Origin
  3. 使用js方式请求图片资源, 需要避免使用缓存,设置url后加上时间戳,或者http头设置Cache-Control为no-cache

主要原因是:

  1. 如果使用跨域的资源画到canvas中,并且资源没有使用CORS去请求,canvas会被认为是被污染了, canvas可以正常展示,但是没办法使用toDataURL()或者toBlob()导出数据,见Allowing cross-origin use of images and canvas。 所以通过在img标签上设置crossorigin,启用CORS,属性值为anonymous,在CORS请求时不会发送认证信息,见HTML attribute: crossorigin
  2. 在启用CORS请求跨域资源时,资源必须允许跨域,才能正常返回,最简单的方式设置响应头Access-Control-Allow-Origin
  3. 图片已经通过img标签加载过,浏览器默认会缓存下来,下次使用js方式再去请求,直接返回缓存的图片,如果缓存中的图片不是通过CORS请求或者响应头中不存在Access-Control-Allow-Origin,都会导致报错。
Tylerrrkd
  • 56

哇啊啊啊啊啊啊啊啊!!
多谢 @拾指相扣 回答评论下的 @吴观涛 大大提供的方法!!

image.src = url + '?time=' + new Date().valueOf();

简直曲线救国啊啊啊!!一次解决!

完整代码

  let image = new Image()
  image.setAttribute('crossOrigin', 'anonymous')
  image.src = url + '?time=' + new Date().valueOf();
  let that = this;
  image.onload = () => {
    // ... do something
  }
  image.onerror = (err) => {
    console.log(err)
  };

canvas无法对跨域的图片进行操作,楼主想要的裁剪保存功能如果在纯前端实现必须使用canvas。所以楼主必须要开启允许跨域,其中,除了服务端要允许当前页面允许跨域之外,楼主执行canvas操作前也要开启跨域。

var img=new Image();
img.crossOrigin="anonymous";
img.src='//';
ctx.drawImage(img, 0, 0, img.width, img.height);

我目前没弄懂 但是发现只要把代码放到服务器上就不报错了

偏爱
  • 1
新手上路,请多包涵

要服务器和img同时设置 一起 还有一招上使用fileReader和url.createObjectUrl

丿灬爱妃接旨丶
  • -1
新手上路,请多包涵

你的图片是不是https的呀,我这下载http的就报跨域,https就能下载,地址也是http

James
  • 3
新手上路,请多包涵
宣传栏