解锁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 相关文章推荐
html5+css3气泡组件的实现
Nov 21 HTML / CSS
CSS3动画效果回调处理详解
Dec 10 HTML / CSS
CSS3实现渐变背景兼容问题
May 06 HTML / CSS
HTML5文档结构标签
Apr 21 HTML / CSS
html5指南-6.如何创建离线web应用程序实现离线访问
Jan 07 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
Jul 04 HTML / CSS
phonegap常用事件总结(必看篇)
Mar 31 HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 HTML / CSS
HTML5如何使用SVG的方法示例
Jan 11 HTML / CSS
CSS 还能这样玩?奇思妙想渐变的艺术
Apr 27 HTML / CSS
CSS3中Animation实现简单的手指点击动画的示例
Jul 15 HTML / CSS
box-shadow单边阴影的实现
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
php的debug相关函数用法示例
2016/07/11 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python中collections模块的基本使用教程
2018/12/07 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
通过python3实现投票功能代码实例
2019/09/26 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
揠苗助长教学反思
2014/02/04 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
1000字打架检讨书
2014/11/03 职场文书
2014年防汛工作总结
2014/12/08 职场文书
大学辅导员述职报告
2015/01/10 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP