解锁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 优势以及网页设计师如何使用CSS3技术
Jul 29 HTML / CSS
css3实例教程 一款纯css3实现的环形导航菜单
Oct 20 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
Dec 29 HTML / CSS
CSS3的一个简单导航栏实现
Aug 03 HTML / CSS
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
Mar 16 HTML / CSS
CSS3毛玻璃效果(blur)有白边问题的解决方法
Nov 15 HTML / CSS
css3 边框、背景、文本效果的实现代码
Mar 21 HTML / CSS
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
Jun 23 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
Mar 15 HTML / CSS
移动端Html5页面生成图片解决方案
Aug 07 HTML / CSS
wordpress添加Html5的表单验证required方法小结
Aug 18 HTML / CSS
css清除浮动clearfix:after的用法详解(附完整代码)
May 21 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
php上传文件问题汇总
2015/01/30 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
javascript Object与Function使用
2010/01/11 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
简析Python的闭包和装饰器
2016/02/26 Python
Python制作简易注册登录系统
2016/12/15 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
python 字典套字典或列表的示例
2019/12/16 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
python中spy++的使用超详细教程
2021/01/29 Python
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
《鞋匠的儿子》教学反思
2014/03/02 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
区域经理岗位职责
2015/02/02 职场文书
个人催款函范文
2015/06/24 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python