BUG-canvas.toDataURL-Tainted canvases may not be exported

BUG-canvas.toDataURL-Tainted canvases may not be exported

月光魔力鸭

2019-06-28 08:52 阅读 1272 喜欢 0 canvas toDataURL

BUG 报错Tainted canvases may not be exported 。 在通过canvas 调用 toDataURL的时候出现的问题。

Tainted canvases may not be exported

出现原因: 在通过canvas drawImage 的时候,图片地址使用的是其他服务器的图片,与当前系统不是同源的,所以会在获得url的时候会因为跨域导致报错。

解决方法

在图片加载前,先设置跨域。

var img = new Image();
img.crossOrigin = 'anonymous';
img.src = 'xxx';
img.onload = function(){
    ctx.drawImage(this,0,0,this.width,this.height);
}

这个设置完成后,对应的图片获取的服务端也要设置跨域,不然图片加载还是会不报错的。

解决方法2

getURLBase64 : function(url) {
				return new Promise((resolve, reject) => {
					var xhr = new XMLHttpRequest()
					xhr.open('get', url, true)
					xhr.responseType = 'blob'
					xhr.onload = function() {
						console.log(this);
						if (this.status === 200) {
							var blob = this.response
							var fileReader = new FileReader()
							fileReader.onloadend = function(e) {
								var result = e.target.result
								resolve(result)
							}
							fileReader.readAsDataURL(blob)
						}
					}
					xhr.onerror = function() {
						reject()
					}
					xhr.send()
				})
			}

将图片通过base64的方式获得,然后设置给图片即可。当然这种情况也需要nginx 设置跨域才可以获取。

这样一看的话,还是第一种更简单方便。

转载请注明出处: https://chrunlee.cn/article/bug-canvas-cross1.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
扩展程序中会有需要请求外部接口获取数据的时候,如果直接在JS中写的话,会跨域,但是谷歌扩展程序支持这种情况,只需要配置一下即可。
最近一段时间想着做个资源网站,奈何没数据,准备从几个相关的站点上抓一些数据,数据量每个站点都在几千万左右,这里简单总结下最近一段时间在做的测试。
国庆马上来临,头像已经先热起来了,为了蹭蹭热度,赶紧加班搞了一个。
需求:可能会有在页面加载的时候想执行某个js,例如统计页面的DOM等等。
小程序需要用到用户的手机号码,看了下API 以及相关的demo,基本都是服务端进行解密的,问题是需要的参数并没有用到secret,只需要 session_key / iv /encryptedData 即可,那完全可以在客户端进行处理啊。
功能来源于客户需求。客户有需求想把班级内所有学生的错题本生成pdf文档下载下来... 目前没有做这个功能,只有页面,还好chrome浏览器有保存pdf的功能,但是一想到这么多的学生,这么多的学科、以及这么多的参数... 还好有puppeteer
很久之前学习chrome扩展插件的时候已经做过一个了,好久没咋用,最近又跑了一个存储服务,准备在配合这个服务做个图床,以后就用这个了,之前的服务器到期忘了迁移数据都没了,这次换了服务器,在家里了,估计以后不会再做了吧,这个算是最后一个了,有啥问题就在这个进行优化了。
前几天同事抱怨说微博太费劲了... 一万多条记录,可能会把他累死,我心想.. 重复工作不都可以用程序代替么..