详解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心形加载的动画源码的实现
Mar 09 HTML / CSS
详解CSS3开启硬件加速的使用和坑
Aug 21 HTML / CSS
css3背景_动力节点Java学院整理
Jul 11 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
Apr 26 HTML / CSS
CSS3实现翘边的阴影效果的代码示例
Jun 13 HTML / CSS
Css3新特性应用之视觉效果实例
Dec 12 HTML / CSS
CSS3 对过渡(transition)进行调速以及延时
Oct 21 HTML / CSS
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
Dec 07 HTML / CSS
HTML5 embed 标签使用方法介绍
Aug 13 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
Nov 19 HTML / CSS
逼真的HTML5树叶飘落动画
Mar 01 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
Mar 15 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
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
php 可变函数使用小结
2018/06/12 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python学习入门细节知识点
2018/03/29 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
创业大赛策划书
2014/03/01 职场文书
分公司经理任命书
2014/06/05 职场文书
大学生工作自荐书
2014/06/16 职场文书
党委领导班子整改方案
2014/09/30 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL