解锁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教程(5):网页背景图片
Apr 02 HTML / CSS
CSS3毛玻璃效果(blur)有白边问题的解决方法
Nov 15 HTML / CSS
CSS3 实现图形下落动画效果
Nov 13 HTML / CSS
HTML5-WebSocket实现聊天室示例
Dec 15 HTML / CSS
html5 canvas实现圆形时钟代码分享
Dec 25 HTML / CSS
深入浅析HTML5中的SVG
Nov 27 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
Mar 22 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
Jul 13 HTML / CSS
html5中canvas图表实现柱状图的示例
Nov 13 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
Apr 23 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
Sep 11 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
python网络爬虫采集联想词示例
2014/02/11 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python集合是否可变总结
2019/06/20 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
古汉语文学求职信范文
2014/03/16 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
合作与交流自我评价
2015/03/09 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
担保书范文
2019/07/09 职场文书