受污染的画布无法导出

Posted

技术标签:

【中文标题】受污染的画布无法导出【英文标题】:Tainted canvas cannot be exported 【发布时间】:2018-02-11 04:53:58 【问题描述】:

关注这个话题 Caching effect on CORS: No 'Access-Control-Allow-Origin' header is present on the requested resource

我已经能够用我的 html-canvas 解决一个奇怪的 CORS 问题。如上面的线程所述,我在通过下面的函数添加图像时收到了标准浏览器 CORS 违规警告,但非常“随机”取决于是否清除浏览器缓存,我无法真正重现原因。当删除 crossOrigin: 'anonymous' 属性时,我完全能够通过这个函数将图像从 S3 添加到画布:

fabric.Image.fromURL url, ((img) ->
    # scale template image
    img.scale 0.5
    img.name = 'template_img'
    # add image to canvas
    canvas.add img
    # send to back
    canvas.sendToBack img
    # make not selectable since its the background image
    img.selectable = false
    return
  )

现在我的应用想要通过

导出画布
dataURL = canvas.toDataURL(
        format: 'png'
        quality: 0.8)

但是,由于现在缺少 crossOrigin = 'anonymous' 属性,这被浏览器阻止了:

DOMException:无法在“HTMLCanvasElement”上执行“toDataURL”: 受污染的画布不得导出。

其实我现在陷入了循环:

    添加 crossOrigin 属性会导致在我的画布上添加图像失败。 删除 crossOrigin 属性会使我在画布上添加图像,但不允许导出它

我已经尝试了一切来完成这项工作,也使用了 CORS 规则,但除了标准通配符和域设置之外,我无能为力。

我在 AWS S3 上的 CORS 规则集:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

如何将图像添加到画布并在之后将其导出?

【问题讨论】:

图片在您的域/服务器上吗?还是来自其他域? a strange CORS issue - 什么问题?图像仍然是交叉原点吗? 图像在我建立了 CORS 规则的 S3 上。 CORS 问题与上述线程完全相同:由于“随机”缓存并删除 crossOrigin 属性解决了它。 【参考方案1】:

也适用于遇到此问题的任何人。我做了更多的研究,发现这确实是 Chrome 的一个常见问题,因为 Safari 似乎工作正常。在画布上添加的 URL 后面添加时间戳时,我会阻止浏览器每次都缓存它。这解决了 crossOrigin 问题,让我可以正确添加属性。

修改代码:

url = url + "?" + Math.random()
fabric.Image.fromURL url, ((img) ->
  # scale template image
  img.scale 0.5
  img.name = 'template_img'
  # add image to canvas
  canvas.add img
  # send to back
  canvas.sendToBack img
  # make not selectable since its the background image
  img.selectable = false
  return
), crossOrigin: 'anonymous'

【讨论】:

以上是关于受污染的画布无法导出的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 图像,无法使用 html5 画布保存,出现受污染的画布错误

我应该在哪里设置 CORS 设置,这样我的画布才不会被污染?

无法在javascript中将图像绘制到画布

受污染的画布不得出口

如何修复 getImageData() 错误画布已被跨域数据污染?

有没有办法确定跨域图像是不是会在不绘制画布的情况下污染画布?