详解canvas绘图时遇到的跨域问题


Posted in HTML / CSS onMarch 22, 2018

当在canvas中绘制一张外链图片时,我们会遇到一个跨域问题。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>crossorigin</title>
</head>
<body>
    <canvas width="600" height="300" id="canvas"></canvas>
    <img id="image" alt="">
    <script>
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        var image = new Image();
        image.onload = function() {
            ctx.drawImage(image, 0, 0);
            document.getElementById('image').src = canvas.toDataURL('image/png');
        };
        image.src = 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3497300994,2503543630&fm=27&gp=0.jpg';
    </script>
</body>

当在浏览器中打开这个页面时,你会发现这个问题:

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

这是受限于 CORS 策略,会存在跨域问题,虽然可以使用图像,但是绘制到画布上会污染画布,一旦一个画布被污染,就无法提取画布的数据,比如无法使用使用画布toBlob(),toDataURL(),或getImageData()方法;当使用这些方法的时候 会抛出上面的安全错误

这是一个苦恼的问题,但幸运的是img新增了crossorigin属性,这个属性决定了图片获取过程中是否开启CORS功能:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>crossorigin</title>
</head>
<body>
    <canvas width="600" height="300" id="canvas"></canvas>
    <img id="image" alt="">
    <script>
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        var image = new Image();
        image.setAttribute('crossorigin', 'anonymous');
        image.onload = function() {
            ctx.drawImage(image, 0, 0);
            document.getElementById('image').src = canvas.toDataURL('image/png');
        };
        image.src = 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3497300994,2503543630&fm=27&gp=0.jpg';
    </script>
</body>

对比上面两段JS代码,你会发现多了这一行:

image.setAttribute('crossorigin', 'anonymous');

就是这么简单,完美的解决了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
介绍CSS3使用技巧5个
Apr 02 HTML / CSS
CSS3 优势以及网页设计师如何使用CSS3技术
Jul 29 HTML / CSS
CSS中越界问题的经典解决方案【推荐】
Apr 19 HTML / CSS
详解CSS3的perspective属性设置3D变换距离的方法
May 23 HTML / CSS
CSS3 实现穿梭星空动画
Nov 13 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
Jan 03 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
Jul 24 HTML / CSS
Html5百叶窗效果的示例代码
Dec 11 HTML / CSS
canvas绘制圆角头像的实现方法
Jan 17 HTML / CSS
html5手机键盘弹出收起的处理
Jan 20 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
Jun 04 HTML / CSS
Html5大屏数据可视化开发的实现
Jun 11 HTML / CSS
canvas 下载二维码和图片加水印的方法
Mar 21 #HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
Mar 21 #HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
Mar 21 #HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
Mar 20 #HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
Mar 20 #HTML / CSS
HTML5 新表单类型示例代码
Mar 20 #HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
Mar 19 #HTML / CSS
You might like
Function eregi is deprecated (解决方法)
2013/06/21 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php获取汉字首字母的函数
2013/11/07 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
axios实现简单文件上传功能
2019/09/25 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
python中使用while循环的实例
2019/08/05 Python
实现Python与STM32通信方式
2019/12/18 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
2014年教育工作总结
2014/11/26 职场文书
年终工作总结范文2014
2014/11/27 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
详解Vue的sync修饰符
2021/05/15 Vue.js