解锁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实现多背景模拟动态边框的效果
Nov 08 HTML / CSS
详解CSS3新增的背景属性
Dec 25 HTML / CSS
基于ccs3的timeline时间线实现方法
Apr 30 HTML / CSS
CSS3.0实现霓虹灯按钮动画特效的示例代码
Jan 12 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
Dec 22 HTML / CSS
HTML高亮关键字的实现代码
Oct 22 HTML / CSS
Html5实现单张、多张图片上传功能
Apr 28 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
Jan 02 HTML / CSS
html5使用canvas实现弹幕功能示例
Sep 11 HTML / CSS
canvas 阴影和图形变换的示例代码
Jan 02 HTML / CSS
HTML5 层的叠加的实现
Jul 07 HTML / CSS
原生CSS实现文字无限轮播的通用方法
Mar 30 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
Vue3为什么这么快
2020/09/23 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
python提取字典key列表的方法
2015/07/11 Python
12步教你理解Python装饰器
2016/02/25 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
numpy排序与集合运算用法示例
2017/12/15 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
文科生自我鉴定
2014/02/15 职场文书
副总经理任命书
2014/06/05 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers
python标准库ElementTree处理xml
2022/05/20 Python
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL