详解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 相关文章推荐
使用CSS实现阅读进度条
Feb 27 HTML / CSS
CSS3 box-sizing属性详解
Nov 15 HTML / CSS
浅谈CSS3中display属性的Flex布局的方法
Aug 14 HTML / CSS
css3编写浏览器背景渐变背景色的方法
Mar 05 HTML / CSS
html5时钟实现代码
Oct 22 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
May 03 HTML / CSS
html5声频audio和视频video等新特性详细说明
Dec 26 HTML / CSS
html5指南-2.如何操作document metadata
Jan 07 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
Jan 31 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
Apr 14 HTML / CSS
详解html5 shiv.js和respond.min.js
Jan 24 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
大学新生欢迎词
2014/01/10 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
顶碗少年教学反思
2014/02/21 职场文书
节约电力资源的建议书
2014/03/12 职场文书
收银员岗位职责范本
2015/04/07 职场文书
公司表扬信格式
2015/05/04 职场文书
初三毕业感言
2015/07/31 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
python3实现无权最短路径的方法
2021/05/12 Python