toDataURL()报错

在使用Canvas对图片进行裁切功能时,用到了toDataURL方法。
在调试过程中,发现执行到该方法是会报以下错误:

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

通过查找资料,整理出了出现该问题的解决方案。

一、情景再现

在百度图库随便搜索的一张图,直接拷贝图片地址在示例中使用;
在img标签中可以正常显示,但是使用toDataURL方法出现该报错提示。

1. 原因分析

仅在页面img显示时无跨域问题,但在toDataURL方法中使用该图片源时就会出现跨域问题。
可能浏览器认为仅展示是安全操作,要使用就是危险操作。

准确的讲
如果使用跨域的资源画到canvas中,并且资源没有使用CORS去请求,canvas会被认为是被污染了, canvas可以正常展示,但是没办法使用toDataURL()或者toBlob()导出数据,见Allowing cross-origin use of images and canvas。

注意 如果仅仅是展示不会有问题,但是如果需要获取做其他事情的时候 就会有同源策略的问题。

2. 解决办法

所以通过在img标签上设置crossorigin属性值为anonymous,及启用CORS(跨域资源共享)。
在CORS请求时不会发送认证信息,见HTML attribute: crossorigin。

示例代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Canvas</title></head><body><div class="wrapper"><h3>目标</h3><span>将图片中的特朗普头像剪裁出来</span><h3>原始图预览</h3><img id="image"  alt=""style="width:300px; height:200px"><h3>Canvas裁切视图</h3><canvas id="canvas-cut" width="100" height="100" ></canvas><h3>Base64结果展示</h3><img id="result" /></div><script>const SRC= "https://img2.baidu.com/it/u=1704416777,980035752&fm=26&fmt=auto&gp=0.jpg";document.getElementById('image').src = SRC;var canvas = document.getElementById('canvas-cut');var cut = canvas.getContext('2d');var img = new Image();img.src = SRC;//处理toDataURL遇跨域资源导致的报错img.crossOrigin = 'Anonymous';img.onload = function() {cut.drawImage(img,290,80,100,100,0 ,0,100,100);var imgbase64 = canvas.toDataURL("image/png");document.getElementById('result').src =imgbase64;};</script></body>
</html>

注意事项
在启用CORS请求跨域资源时,资源必须允许跨域,才能正常返回。

其他方法
最简单的方式设置响应头Access-Control-Allow-Origin。图片已经通过img标签加载过,浏览器默认会缓存下来,下次使用js方式再去请求,直接返回缓存的图片,如果缓存中的图片不是通过CORS请求或者响应头中不存在Access-Control-Allow-Origin,都会导致报错。

使用canvas的toDataURL方法将图片转为base64报错:Tainted canvases may not be exported相关推荐

  1. fabricJs中给canvas添加跨域背景图片报错Tainted canvases may not be exported

    最近几期我想分享一下我的项目中使用vue+fabric.js过程中遇到的坑. 就比如给canvas加背景时,就会出现跨域的报错提示. 我用的是vue-element相关框架,在此不多做赘述,后面再出专 ...

  2. cesium中的billboard加载在线图片报错Tainted canvases may not be loaded

    加载项目中的图片没有问题,加载在线图片的时候就会报错 解决方法: image.setAttribute('crossOrigin', 'anonymous'); 原因:canvas 绘制的时候在线图片 ...

  3. Canvas - 错误:Tainted canvases may not be exported

    记录日期:2019年6月26日 22点21分 Canvas 的内容保存为图片,但是一直不成功.报错信息如标题,意思指被污染的画布不能被导出. 理论上来讲,导出为图片是一定可行的,但是被污染的画布是不允 ...

  4. 使用canvas.toDataURL把图片转为base64格式

    使用canvas.toDataURL把图片转为base64格式 function getBase64(url) {//通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 c ...

  5. canvas学习——toDataURL()方法

    toDataURL()方法 1.toDataURL()方法是什么? toDataURL()是canvas对象的一种方法,用于将canvas对象转换为base64位编码: 2.利用canvas的toDa ...

  6. canvas的toDataURL()方法

    canvas的toDataURL()方法是返回一个包含图片展示的 数据URL.可以使用 type 参数其类型,默认为 PNG 格式.图片的分辨率为96dpi. 一.语法 canvas.toDataUR ...

  7. canvas跨域:Tainted canvases may not be exported解决方法

    现象: 使用html2canvas.js插件绘图时跨域图片绘制过程中报错:Tainted canvases may not be exported 解决方法: var content = docume ...

  8. php 图片文件转base64编码格式,php如何将图片转为base64编码格式

    php将图片转为base64编码格式的方法:首先读取图片流:然后利用[base64_encode]函数进行编码格式转换即可. PHP保存Base64图片base64_decode的问题 PHP对Bas ...

  9. Nodejs 使用 Buffer 将图片转为 base64

    一直以为图片转为 base64 很复杂,结果今天看了下 Docusaurus 的 plugin-ideal-image 插件源码,居然只要一行代码就完事了: const toBase64 = (ext ...

最新文章

  1. android怎么监听多点触摸_什么是多点触控技术,有哪些用途
  2. ssm 异常捕获 统一处理_SpringMVC 统一异常处理介绍及实战
  3. 【视频课】StyleGAN人脸生成与年龄表情编辑:原理与实践
  4. MongoDB常用使用场景介绍
  5. delphi开发回忆录——面向对象的基础,继承
  6. Python爬取百度搜索风云榜实时热点.
  7. qt 隐藏控制台_带可选GUI的Qt控制台应用程序
  8. Envious Exponents
  9. AS2在FLASH中调用EXE文件方法详细说明 已测试可行
  10. Excel如何用身份证号提取性别
  11. 【20220412】文献翻译4:交互中的手势和语言概述
  12. linux磁盘坏道测试,Linux磁盘坏道检测
  13. CogPDF417Tool工具
  14. 二项分布、poisson分布、gamma分布一些关系的笔记
  15. 2015陈奕迅another eason‘s life演唱会歌单
  16. 微信运动_刷步思路+Python源码+云部署(持续更新)_一蓑烟雨任平生
  17. gitbook 插入图片_【整理】Gitbook和Gitbook Editor使用心得
  18. 利用快慢指针判断循环
  19. Java线程池的知识
  20. [CC2642r1][syscfg] 中文图形化界面,方便快速熟悉工具使用

热门文章

  1. UnityShader——MaterialCapture材质捕捉效果 (翡翠斧头)
  2. 海信信号机后台服务器配置,海信电视信号源设置方法-电视机信号设置方法
  3. vue 中的打印 局部打印
  4. js和jq设置disabled属性与移除disabled属性
  5. 北京海淀区统计数据集(2016年3月-2019年3月)
  6. no qualifying bean of type bean的解决方法
  7. 100G超长距离传输模块,彩光模块相关知识
  8. 搭建PHP开发环境(Apache+PHP+MySQL)
  9. 单片机学习笔记————51单片机实现在数码管中实现iphone4S开机密码锁的程序
  10. Hadoop系列 (九):Sqoop详细介绍