解锁canvas导出图片跨域的N种姿势小结


Posted in HTML / CSS onJanuary 24, 2019

本文介绍了解锁canvas导出图片跨域的N种姿势小结,分享给大家,具体如下:

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

上面这个错误相信大家用canvas执行 toDataUrl导出图片的时候都遇到过,图片服务器域名和当前不一样,因为安全策略不允许跨域导出图片

解决这个跨越问题方式有多种

一 、将图片转换成base64

图片变成base64就没有域名一说了,自然不存在跨域

注意:图片转换成base64加增加图片文件大小,如果图片比较大,不建议转换base64,否则会增加网页加载时间,影响网站速度,这种方式一般适用于小图

二、 图片服务器设置允许跨域

即请求图片返回的响应头中带有Access-Control-Allow-Origin切值为 *(允许所有网站跨域请求)或者当前网站域名(只允许固定域名下跨域请求), 然后前端在加载图片是设置图片跨域属性img.crossOrigin="anonymous"。具体代码如下

var canvas = document.getElementById('myCanvas')
  var ctx = canvas.getContext('2d')
  var img = document.createElement('img')
  img.crossOrigin="anonymous"
  img.src = 'https://p4-q.mafengwo.net/s12/M00/CA/3B/wKgED1w8fL6ADk16AAXyDaz2bdU61.jpeg'
  img.onload = function() {
    ctx.drawImage(img,0,0,500,300);
    console.log(canvas.toDataURL())
  }

这样前后结合跨域问题便迎刃而解

三、把图片放到当前域名下

原谅我不厚道的笑了,这的确是一种可以解决问题。

BUT 实际项目中图片一般都存储在cdn上,所以这种方式不太现实???

图片变成base64就没有域名一说了,自然不存在跨域

四、当图片服务没法设置跨域响应头时

确实有这种情况,比如获取第三方网站的头像,比如微信头像,然后前端动态生成新的图片,微信头像图片不允许跨域导出,怎么办??? 上面的几种方式都不好使

这种情况需要后端协助了,后端做一层转发,服务端获取头像,转换成base64返回前端,或者存储到本地允许跨域的服务器上,生产一个新的图片链接,返回给前端,这个时候结合方法一或者方法二,跨域问题也自然解决

如果你用的htmlToCanvas插件导出图片的话,则需要添加useCORS: true配置项,原理跟方法二一样,当然前置条件是图片域名允许跨域

至此我所知道的N中方式介绍完毕了,欢迎补充

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3美化表单控件全集
Jun 29 HTML / CSS
CSS3实现的闪烁跳跃进度条示例(附源码)
Aug 19 HTML / CSS
CSS3实现曲线阴影和翘边阴影
May 03 HTML / CSS
HTML5中原生的右键菜单创建方法
Jun 28 HTML / CSS
HTML5拖放效果的实现代码
Nov 17 HTML / CSS
微信html5页面调用第三方位置导航的示例
Mar 14 HTML / CSS
HTML5的postMessage的使用手册
Dec 19 HTML / CSS
详解canvas绘制网络字体几种方法
Aug 27 HTML / CSS
前端H5 Video常见使用场景简介
Aug 21 HTML / CSS
CSS3 实现的图片悬停的切换按钮
Apr 13 HTML / CSS
纯html+css实现Element loading效果
Aug 02 HTML / CSS
深入理解CSS 中 transform matrix矩阵变换问题
Aug 30 HTML / CSS
详解canvas绘制多张图的排列顺序问题
Jan 21 #HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
Jan 18 #HTML / CSS
canvas绘制圆角头像的实现方法
Jan 17 #HTML / CSS
HTML5如何使用SVG的方法示例
Jan 11 #HTML / CSS
Canvas 像素处理之改变透明度的实现代码
Jan 08 #HTML / CSS
详解Canvas实用库Fabric.js使用手册
Jan 07 #HTML / CSS
Html5原创俄罗斯方块(基于canvas)
Jan 07 #HTML / CSS
You might like
关于PHP中Object对象的笔记分享
2011/06/28 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
angularjs 的数据绑定实现原理
2018/07/02 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
Python中基础的socket编程实战攻略
2016/06/01 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python自定义时钟类、定时任务类
2021/02/22 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
python之生成多层json结构的实现
2020/02/27 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
幼师自荐信
2013/10/26 职场文书
管理失职检讨书
2014/02/12 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
财产公证书
2014/04/10 职场文书
小学生暑假家长评语
2014/04/17 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2016年元旦寄语
2015/08/17 职场文书