Canvas合成图片跨域解决

496 阅读2分钟

最近在做海报分享的功能,其中一个需求是接口给出海报,然后需要在上面加上二维码,

图片可以正常访问到,但是调用toDataUrl 合成图片的时候报错, 报错类似

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

查了下原因是同源策略canvas出于安全因素认为不同源的图片会使画布受到”污染“,从而做了一些操作限制。

于是搜了下资料,很多文章都说加载图片的时候加上 img.setAttribute('crossOrigin', 'anonymous') , 或者加上时间戳,我试了下都没有生效,可能与图床是阿里云的有关,反而引起了跨域,发现图片请求上面带上了我自己的origin,随后找到后端让加上跨域,之后可以正常访问并且生成图片了。

后端可能出于安全考虑没有开放给所有域名 ,只是加了个白名单,给线上所有环境的域名,比如*.test123.io,这样部署过后的项目可以正常访问图片资源了,但我本地用localhost域名的项目还是会被跨域限制。后端跟我说可以改host文件,我搜了下,就get到了一个前端跨域的小技巧, windows ctrl + r 输入drivers 找到 etc 下面的host文件

本机ip dev.test123.io

把一个平时开发生产用不到的假域名dev.test123.io 映射到本机ip上, 再用假域名打开本地项目,这样就可以伪装成白名单内的域名。不过这样可能会引发其他静态资源的跨域,需要结合具体情况使用。

解决canvas使用oss图片绘制报错

canvas图片绘制跨域问题解决方案Tainted canvases may not be exported

解决canvas图片getImageData,toDataURL跨域问题