使用html5 canvas转图片跨域问题

2,009 阅读1分钟

问题:

公司业务需要,做一个html页面截图的功能,准备使用canvas 绘制video标签中的画面并转成base64传到后台保存,总是会出现

ScreenShot.js:39 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

解决:

项目中使用的是video.js 进行视频播放,该插件最终使用的是html5的video标签进行视频的播放,视频所在的服务器和当前web应用程序所在的服务器不再一起,在使用canvas绘制图片的时候已经将画布污染了,在调用canvas.toDataUrl()方法的时候会报错 具体的原因可以参照下这个文章 一旦画布被污染则以下方法都会报错:

  1. Calling getImageData() on the canvas's context
  2. Calling toBlob() on the canvas element itself
  3. Calling toDataURL() on the canvas

video标签中的视频是跨域的,所以在video标签中添加属性 crossorigin="anonymous" 在添加之后对应的视频服务器也需要添加响应头以允许跨域:

Access-Control-Allow-Origin:*
Access-Control-Allow-Methods:*
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: *

上面是在视频服务器中的配置,对应的如果是img之类的标签需要引入静态资源的,对应的资源服务器在请求头中都需要设置,这里的* 代表的是允许所有.根据具体的需求进行配置. 该解决方案不怎么好,如果多个视频服务器则每个服务器都需要配置,并且带来一些安全隐患.如果有更好的方案,希望大牛指导下.