解决 canvas 将图片转为base64报错: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement'

详解canvas.toDataURL()报错的解决方案全都在这了 报错详尽信息 Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported. 关键词 canvas.toDataURL() crossOrigin Access-Control-Allow-Origin 前言 最近在做一个创意类的图片合成工具,大概齐就是通过拼接自定义的文字和图片信息生成一张商品图片类似的功能,项目中用到了fabric.js这个画板库,最后一步在保存图片的时候报上面的一长串错误,墙内墙外 立即下载

原文链接:https://www.jianshu.com/p/6fe06667b748

1:背景

最近在做一个图片内容识别的项目,采用的是阿里巴巴的付费接口。大致流程为:

1:用户上传图片
2:将图片转为base64的格式发送给阿里的接口
3:阿里接口返回图片的内容信息

2:遇到的问题

这里边第二步转base64 ,我采用html5的canvas,将图片绘制到画布上,然后用canvas的 toDataURL 方法。
但是在图片转base64的过程中遇到了两个问题,

  • 1:图片无法绘制,转成的base64 用浏览器打开是空的透明画布,如图

image.png

 

代码片段如下:

  var canvas=document.getElementById("canvas"),//获取canvas
      ctx = canvas.getContext("2d"), //对应的CanvasRenderingContext2D对象(画笔)
      img = new Image(),//创建新的图片对象
      base64 = '' ;//base64 

  img.src = 'http://www.xxxx.png';
  ctx.drawImage(img,0,0);
  base64 = canvas.toDataURL("image/png"); 

这个时候我想到问题应该是 图片还没加载完毕 就已经绘制了,既然是这样,那么修改为以下:

  var canvas=document.getElementById("canvas"),//获取canvas
      ctx = canvas.getContext("2d"), //对应的CanvasRenderingContext2D对象(画笔)
      img = new Image(),//创建新的图片对象
      base64 = '' ;//base64 
  img.src = 'http://www.xxxx.png';
  img.onload = function(){//图片加载完,再draw 和 toDataURL
       ctx.drawImage(img,0,0);    
       base64 = canvas.toDataURL("image/png"); 
   };

修改完毕我正要打算喝杯水庆祝一下,一刷新页面,一口老血喷了出来,chrome控制台又报错如下:

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

大概意思是canvas无法执行toDataURL方法:污染的画布无法输出,请原谅我的灵魂翻译。
经google 发现原来是受限于 CORS 策略,会存在跨域问题,虽然可以使用图像(比如append到页面上)但是绘制到画布上会污染画布,一旦一个画布被污染,就无法提取画布的数据,比如无法使用使用画布toBlob(),toDataURL(),或getImageData()方法;当使用这些方法的时候 会抛出一个安全错误

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

具体详情附上一个链接非常详细如下:https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image,非常值得一看,个人理解可能不到到位,还是建议读读这个链接。

解决方案:

图片设置 :crossOrigin属性
代码片段:img.setAttribute("crossOrigin",'Anonymous')

完整代码:

``
  var canvas=document.getElementById("canvas"),//获取canvas
      ctx = canvas.getContext("2d"), //对应的CanvasRenderingContext2D对象(画笔)
      img = new Image(),//创建新的图片对象
      base64 = '' ;//base64
  img.setAttribute("crossOrigin",'anonymous') 
  img.src = 'http://www.xxxx.png';
  img.onload = function(){//图片加载完,再draw 和 toDataURL
       ctx.drawImage(img,0,0);    
       base64 = canvas.toDataURL("image/png"); 
   };

stackoverflow上解决方案:
地址:https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror

Tips:如果遇到其他canvas 关于SecurityError 的问题,也可以尝试一下这个解决方法。
另外经过多次搜索,总结了几个小窍门

1:使用google 。baidu搜索的都是转来转去的几篇文章,干扰太大。
2:首先搜索bug之家 :stackoverflow,总有解决你的bug的方案,链接:https://stackoverflow.com/
3:web文档之家:mozilla的web文档 ,非常权威,非常详尽。链接:https://developer.mozilla.org/en-US/



 

AXI backpressure反压机制代码 本文将xilinx的axi读写代码进行修改,实现吞吐量达到50% 阅读详情

相关推荐

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1880

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

受污染的画布

weixin_49295874的博客 1万+

基于Python的手语识别项目(简单版)

总之,看似简单的代码,实则花费了我不少的时间和精力,我曾无数次在深夜的灯光下,与代码为伴,只为了一点点优化,一丝丝提升。让我们一起,以尊重原创的精神,推动编程领域的发展,让这份热爱和技术的力量,照亮更多人的前行之路。模型的建立(---------------本人采用的是开源的asl-alphabet手势识别库,记得放在路径下--------------)current_dir需要根据自己的路径修改!current_dir需要根据自己的路径修改!current_dir需要根据自己的路径修改!

lusen_j的博客 1966

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

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported 一、总结 一句话总结:解决方案是图片设置crossOrigin属性 图片设置 :crossOrigin属性代码片段:img.setAttribute("crossOr...

weixin_34365417的博客 1801

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

目标是优化风力涡轮机的功率调度,使其在给定的实时风速数据下,最小化涡轮机关键组件(如塔架和主轴)的疲劳损伤。问题的挑战在于,考虑通信延迟和测量噪声的同时,要确保功率输出与风速变化的响应快速且准确。

2401_82549447的博客 6627

懒人精灵手游内存技术分析

教学声明:全套教程教学用到的游戏采用手游私服网游进行测试,不针对任何游戏。教学只做计算机技术研究,不做其他用途。

yizhihaoren123的博客 1655

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

现象:在使用canvas的toDataURL()方法时,控制台有时会报错:Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported. 原因:这是由于之前由drawImage()向canvas导入的图片跨域而导致的。 解决方法: 1、在引用图片之前打开跨域资源允许权限(一定要注意顺序): var img=new Image; img.setA

sumimg的博客 1万+

常用的数据结构以及常用的算法

常用的数据结构以及常用的算法 常用数据结构 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构往往同高效的检索算法和索引技术有关。 一、线性表 线性结构: 最常用、最简单的一种数据结构。 线性表: 典型的线性结构。基本特点是线性表中的 数据元素有序且有限。结构中: ① 存在一个唯一的被称为“第一个”的数据元素; ② 存在一个唯一的被称为“最后一个”的数据元素; ③ 除第一个元素外,每

qq_47605698的博客 1445

Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34249678的博客 2万+

智能测试策略优化:平衡覆盖率、时间和资源

在软件开发过程中,测试是确保软件质量的关键环节。然而,测试工作往往面临着诸多挑战,其中如何在保证测试覆盖率的前提下,合理分配时间和资源是一个核心问题。本文章的目的在于探讨智能测试策略的优化方法,帮助软件测试团队在有限的时间和资源条件下,实现尽可能高的测试覆盖率。文章的范围涵盖了智能测试策略的核心概念、算法原理、数学模型、实际应用案例以及相关工具和资源等方面。本文将按照以下结构进行组织:首先介绍智能测试策略优化的背景和相关概念,包括核心术语和缩略词的定义;

AIGC应用创新大全的博客 618

BAT007:批量为当前目录下的文件夹添加前缀或后缀

摘要:编写批处理程序,实现批量为当前目录下的文件夹添加前缀或后缀。

qq_31762031的博客 4052

canvas.toDataURL报错: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement'

报错 用canvas的 toDataURL 方法将图片转为base64时报错,报错信息如下所示: 原因 度娘了下发现是 图片和网站域名不一致,导致跨域出现的问题; 解决办法 图片设置 crossOrigin属性:img.setAttribute(“crossOrigin”,‘anonymous’) 完整代码 <canvas id="myCanvas" width="200" hei...

yihanzhi的博客 8839

小众但实用:Python爬取钉钉/企业微信消息,实现办公数据自动化采集(完整版)

钉钉/企业微信的办公数据自动化采集,属于「小众但极度实用」的Python技巧——它不像爬虫爬取电商/网页数据那样被广泛关注,但能直接解决职场人的「刚需痛点」,把每天1-2小时的手动数据整理工作,变成「一键自动化完成」。这套技巧的核心价值,不在于「技术有多高深」,而在于「能真正落地、能真正提升效率」—— 几行简单的Python代码,就能解放双手,让你从繁琐的重复工作中解脱出来,专注于更有价值的核心工作。更重要的是:所有的技术和代码,都是基于「合规合法」的前提,守住了技术的底线,也守住了职场的原则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1928

exception:Failed to execute 'toDataURL' on 'HTMLCanvasElement' 解决方案

1.情景展示   当使用canvas 将图片转为base64报错信息如下:    Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported 2.解决方案   第一种情况:本地测试&图片引自本地   ...

weixin_30625691的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

canvas导出绘制图片canvas.toDataURL()报错

答案:这个问题因为是基于file:// 进行调试的,而chrome做了安全相关的处理,主要是HTML5安全的CORS(跨域资源共享)的安全限制,造成出现这样的提示,如果你需要在自己的电脑上调试的话,只需要本地搭建一个服务器环境就可以了。canvas绘制图片后,想导出图片,用canvas.toDataURL获取,发现打印不出数据,还报错。前面我一直是本地进行的所以一直报错,现在我搬到PHP环境,就解决了。不是代码问题,是环境问题。一直想了很久,查资料,这代码也没有错啊。效果图:可以打印出来图片了。

青茶 1810

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

canvas生成图片toDataURL报错的原因和解决方法

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

weixin_30544657的博客 2138

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

uniapp H5 自定义海报生成:canvas跨域、长按识别与微信分享全实践

Canvas是Web前端图形绘制的核心技术,但跨域资源共享(CORS)机制往往成为图片绘制与导出的瓶颈。浏览器出于安全考虑,会污染未经CORS许可的跨域图片画布,导致toDataURL()导出base64时抛出SecurityError。解决这一问题的关键在于服务端正确配置Access-Control-Allow-Origin响应头,并在客户端加载图片时设置crossOrigin属性。攻克跨域后,canvas才能稳定输出高清海报,进而通过图片标签实现微信长按识别小程序码,并借助微信JS-SDK完成分享转发。

weixin_34216196的博客 547

Tainted canvases may not be exported

Tainted canvases may not be exported.场景解决方法总结 场景 在使用html canvas进行绘画,之后想通过canvas的Api toDataURL toBlob 转换为base64格式 或者二进制临时文件的,但是报错了。错误的提示内容如下 DOMException: Failed to execute ‘toBlob’ on ‘HTMLCanvasElem...

topc2000的博客 1万+

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may n...

canvas绘制图片,由于浏览器的安全考虑,如果在使用canvas绘图的过程中,使用到了外域的图片资源,那么在toDataURL()时会抛出安全异常: Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. 解决...

weixin_34417200的博客 3937

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

头像裁剪的主要实现是同事找来发我的,用着还不错。记一下,可以用作以后研究。 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-

长歌的博客 1953

canvas绘制网络图片执行toDataURL()报错

在用canvas绘制的图片然后执行toDataURL()的时候,报了个错。

qq_23447231的博客 1880

canvas跨域:Tainted canvases may not be exported.

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.  在使用canvas的toDataURL方法,如果图片跨域,会报如上错误。 解决方法是给image标签加一个允许跨域的属性:crossorigin="anonym...

ljqscdnljq的博客 1万+

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

一旦您将未经 CORS 批准从其他来源加载的任何数据绘制到画布中,画布就会被污染。受污染的画布不再被认为是安全的,任何从画布取回图像数据的尝试都将导致抛出异常。 在受污染的画布上调用以下任何一个都会导致错误: 调用getImageData()画布的上下文 调用toBlob()上的元素本身 toDataURL()在画布上调用 当画布被污染时尝试任何这些都会导致SecurityError抛出 a 。这可以防止用户在未经许可的情况下使用图像从远程网站提取信息而暴露私人数据。 以上信息来自mozila 大概的意思就

qq_32486011的博客 4941

html2canvas 报错:Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement : Tainted canvases may not be ...

html2canvas 报错:Failed to execute 'toDataURL' on 'HTMLCanvasElement : Tainted canvases may not be ...

杨杨吖的博客 4266
上一篇: ffmpeg 各命令参数详解
下一篇: macOS 安装homebrew报错LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54解决方法
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值