现象:在使用canvas的toDataURL()方法时,控制台有时会报错:Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.
原因:这是由于之前由drawImage()向canvas导入的图片跨域而导致的。
解决方法:

1、在引用图片之前打开跨域资源允许权限(一定要注意顺序):

var img=new Image;
img.setAttribute('crossOrigin', 'anonymous') //关键
img.src = url + '?time=' + new Date().valueOf();
img.src="图片地址";

2、存放图片地址的服务器也要开启跨域允许权限,不然会报错:No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

如Apache设置:
①.打开LoadModule headers_module modules/mod_headers.so

②.在虚拟主机内加上 Header set Access-Control-Allow-Origin *

总结

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

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

最后 贴上我canvas绘制图片,画线最后生成图片的代码

<div class="jiepingCanvas" id="jtCs"  v-show="dialogJPG"><canvas id="mycanvas" ref="mycanvas" width="848" height="508"></canvas><div class="yesNo"><div class="jtYes" @click="jtSure()"><img src="../common/comImg/yes.png" alt=""></div><div class="jtYes" @click="jtCancel()"><img src="../common/comImg/no.png" alt=""></div></div><div class="tipsjt">提示:图片可以进行画线操作</div>
</div>
data() {return {onoffjt:false,oldxjt:0,oldyjt:0,ctxjt:'',linecolorjt:'',linwjt:8,onArrjt:[],endArrjt:[],ctxjt:"",huajt:false,canvasJT:""}
}//初始化画布
canvasInit(){var that=thisvar imgUrl='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2583035764,1571388243&fm=26&gp=0.jpg'that.dialogJPG=true//  获取canvasthat.canvasJT = document.getElementById("mycanvas")var a = setInterval(() =>{that.canvasJT = document.getElementById("mycanvas")if(!that.canvasJT){return false} else {clearInterval(a)that.ctxjt = that.canvasJT.getContext('2d')var img = new Image()img.src = imgUrl+"?timeStamp="+new Date();img.setAttribute("crossOrigin",'anonymous')img.onload = function(){if(img.complete){//  根据图像重新设定了canvas的长宽that.canvasJT.setAttribute("width",844)that.canvasJT.setAttribute("height",504)//  绘制图片that.ctxjt.drawImage(img,0,0,844,504)that.initjt()}}that.dialogJPG=true}},1)
}//开始画线
initjt(){//画一个黑色矩形this.ctxjt.fillStyle="transparent";this.ctxjt.fillRect(0,0,848,508);//按下标记this.onoffjt=false;this.oldxjt=0;this.oldyjt=0;this.linecolorjt=this.linecolor;//宽度默认为8this.linwjt=8;//鼠标移动事件,事件绑定this.canvasJT.addEventListener("mousemove",this.drawjt,true);this.canvasJT.addEventListener("mousedown",this.downjt,false);this.canvasJT.addEventListener("mouseup",this.upjt,false);
},
//鼠标按下事件
downjt(event){if(this.huajt==true){this.onoffjt=false}else{this.onoffjt=true;this.oldxjt=event.pageX-this.canvasJT.getBoundingClientRect().left;this.oldyjt=event.pageY-this.canvasJT.getBoundingClientRect().top;console.log(this.oldxjt,this.oldyjt,'event')}
},
//鼠标绘制线条
drawjt(event){if(this.onoffjt==true){var newxjt=event.pageX-this.canvasJT.getBoundingClientRect().left;//getBoundingClientRect方法是边框距离浏览器的距离var newyjt=event.pageY-this.canvasJT.getBoundingClientRect().top;// console.log(newx,newy,'000')this.ctxjt.beginPath();this.ctxjt.moveTo(this.oldxjt,this.oldyjt);this.ctxjt.lineTo(newxjt,newyjt);// console.log(newx);this.ctxjt.strokeStyle=this.linecolorjt;this.ctxjt.lineWidth=this.linwjt;this.ctxjt.lineCap="round";this.ctxjt.stroke();this.oldxjt=newxjt;this.oldyjt=newyjt;let xy={x:this.oldxjt,y:this.oldyjt}this.onArrjt.push(xy)}},
//鼠标抬起事件
upjt(){this.onoffjt=false;if(this.onArrjt.length>0){this.endArrjt.push(this.onArrjt)this.onArrjt=[]}
},
//点击确认生成图片
jtSure(){let dataURL = document.getElementById('mycanvas')let dataURLs=dataURL.toDataURL("images/png")let params = {data: dataURLs,compid: 30,hzm:'png'};postUpFile(params).then(res => {let { ReturnCode, Data } = res;if (ReturnCode == 200) {let DataUrl = Data.Url;console.log(DataUrl,'DataUrl路径')let msg=this.nickName+'#&$'+DataUrllet senBtnws={order:enumPack.enum_msg.drawImage,uid:Number(this.option.uid),msg:msg,device:4}this.handdleMsg(JSON.stringify(senBtnws))this.stepArray.push(DataUrl)} });this.dialogJPG=falselet c=document.getElementById("mycanvas");  let cxtjt=c.getContext("2d");  cxtjt.clearRect(0,0,c.width,c.height);
},
//点击取消清除画布
jtCancel(){this.dialogJPG=falselet c=document.getElementById("mycanvas");  let cxtjt=c.getContext("2d");  cxtjt.clearRect(0,0,c.width,c.height);
}
}

以上参考了很多大神的文章
如:https://www.cnblogs.com/sunala/p/7085525.html https://segmentfault.com/q/1010000008648867

canvas生成图片toDataURL报错(Uncaught DOMException: Failed to execute ‘toDataURL‘ on ‘HTMLCanvasEl)相关推荐

  1. 头像裁剪和Uncaught DOMException: Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvases m

    此文是半原创. 头像裁剪的主要实现是同事找来发我的,用着还不错. 记一下,可以用作以后研究. 此文主要记录一个要点: 当用户上传已上传头像,裁剪头像弹窗获取到图片,当调用canvas的toDataUR ...

  2. Uncaught DOMException: Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvases may no

    未捕获的DomeException:未能在"HTMLCanvaElement"上执行"toDataURL":可能无法导出受污染的画布.出现这个bug的原因可能有 ...

  3. js base64解码JWT失败:VM273:1 Uncaught DOMException: Failed to execute 'atob' on 'Window': The string to

    前端获取后端服务生成JWT,利用js方法base64解码payload段: window.atob("eyJzdWIiOiJ0ZXN0MyIsInVzZXJJZCI6IjEwMTY5MiIs ...

  4. #报错解决#TypeError Failed to execute ‘readAsText‘ on ‘FileReader‘ parameter 1 is not of type ‘Blob‘

    问题描述 在实现需求:批量下载的时候,返回的数据类型设置为blob $http({method: 'post',url: dataurl,data: bodyParam,headers: { 'Con ...

  5. Uncaught SecurityError: Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvases may

    一旦您将未经 CORS 批准从其他来源加载的任何数据绘制到画布中,画布就会被污染.受污染的画布不再被认为是安全的,任何从画布取回图像数据的尝试都将导致抛出异常. 在受污染的画布上调用以下任何一个都会导 ...

  6. chrome浏览器出现Uncaught DOMException: Failed to execute ‘postMessage‘ on ‘Window‘: HTMLUnknownElement ob

    经过我一两个小时的时间发现是谷歌扩展程序的问题,具体什么问题咱也不太清楚,把扩展程序关了就OK了,可能是某一个的问题,我的是这个seleniu ide的问题

  7. Canvas引入跨域的图片导致toDataURL()报错的问题的解决

    本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ...

  8. java todataurl_canvas.toDataURL()报错的解决方案全都在这了

    报错详尽信息 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases ...

  9. Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvases may not be exported.

    Intro 我在使用qrcode.react测试使用文本生成二维码的功能. 当执行以下API时,报错: let domTarget = event.target; let text = domTarg ...

最新文章

  1. java使用url和tns两种方式连接数据库执行存储过程
  2. Spring Boot 2.4发布了,但 Spring Cloud 用户不推荐着急升级
  3. UNIX环境高级编程第三章
  4. android lk DEFINES定义的环境变量的值
  5. 【转载】2009年春晚节目单提前揭晓
  6. python输出不重复的单词_python-如何在文本文件中创建所有单词的列表,但字母重复的单词除外...
  7. js带开关的时钟_昌利JS系列混凝土搅拌机衬板配件
  8. 【pyqt5】 读取numpy arrray 显示图片
  9. Go语言channel与select原理
  10. 关于group by的用法 原理
  11. 【华为云技术分享】序列特征的处理方法之一:基于注意力机制方法
  12. 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
  13. oa系统怎么安装服务器配置,OA系统安装配置及维护手册-金蝶在线服务中心.DOC
  14. 内核仿阿里巴巴小说网站源码 PC端+WAP端
  15. 如何管理员工工时表?
  16. rtklib 后处理_RTKLib的Manual解读
  17. 启用计算机上的无线,如何使用命令提示符打开或关闭计算机上的wifi
  18. 2021中国科技大学计算机博士招生,中国科学技术大学2021年拟录取博士研究生名单公示,2661人!...
  19. linux 关闭桌面休眠,Linux关闭休眠和屏保模式
  20. python教育学_为什么老男孩教育学Python课程更有优势?

热门文章

  1. VcdRom 虚拟光驱驱动代码分析
  2. 06:PWM与电机驱动【MSP430F5529】
  3. x11学习一:linux下x11通过wid获取窗口类型(桌面窗口、普通窗口、dock窗口等)
  4. java 导入 证书_如何把安全证书导入到java中的cacerts证书库
  5. python刷新获取实时数据_Python实时数据更新解决方法
  6. C语言中的布尔运算的作用,深入理解计算机系统(2.3)------布尔代数以及C语言运算符...
  7. Verilog编程之道 - case语句
  8. 初探 MicroApp,一个极致简洁的微前端框架
  9. Zepto.js框架
  10. Predis操作redis参考手册