解锁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开启硬件加速的使用和坑
Aug 21 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
May 07 HTML / CSS
CSS3点击按钮实现背景渐变动画效果
Oct 19 HTML / CSS
利用css3径向渐变做一张优惠券的示例
Mar 22 HTML / CSS
html5 sessionStorage会话存储_动力节点Java学院整理
Jul 06 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
Jan 09 HTML / CSS
HTML5 Canvas绘制五星红旗
May 04 HTML / CSS
html5使用canvas实现弹幕功能示例
Sep 11 HTML / CSS
HTML5实现桌面通知 提示功能
Oct 11 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
Html5通过数据流方式播放视频的实现
Apr 27 HTML / CSS
CSS实现单选折叠菜单功能
Nov 01 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
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
Yii rules常用规则示例
2016/03/15 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
vue组件的写法汇总
2018/04/12 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python调用命令行进度条的方法
2015/05/05 Python
python paramiko模块学习分享
2017/08/23 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
外企测试工程师面试题
2015/02/01 面试题
门卫人员岗位职责
2013/12/24 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
php解析非标准json、非规范json的方式实例
2022/05/10 PHP