解锁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 相关文章推荐
让IE6、IE7、IE8支持CSS3的脚本
Jul 20 HTML / CSS
css3.0 图形构成实例练习二
Mar 19 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
Aug 01 HTML / CSS
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
Jan 30 HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 HTML / CSS
html5 viewport使用方法示例详解
Dec 02 HTML / CSS
html5使用canvas画一条线
Dec 15 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
canvas 基础之图像处理的使用
Apr 10 HTML / CSS
css3实现背景图片颜色修改的多种方式
Apr 13 HTML / CSS
html实现弹窗的实例
Jun 09 HTML / CSS
使用HBuilder制作一个简单的HTML5网页
Jul 07 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 DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php简单复制文件的方法
2016/05/09 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
用Django实现一个可运行的区块链应用
2018/03/08 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
公积金转移接收函
2014/01/11 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
客服部班长工作责任制
2014/02/25 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2014年检验科工作总结
2014/11/22 职场文书
追悼会答谢词范文
2015/09/29 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL