详解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实现的win8加载动画的实例分析
Dec 11 HTML / CSS
用CSS3绘制三角形的简单方法
Jul 17 HTML / CSS
CSS3中几个新增加的盒模型属性使用教程
Mar 01 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
May 12 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
Jan 30 HTML / CSS
canvas需要在标签里直接定义宽高
Dec 17 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
Jan 03 HTML / CSS
HTML5的postMessage的使用手册
Dec 19 HTML / CSS
使用canvas一步步实现图片打码功能的方法
Jun 17 HTML / CSS
iframe跨域的几种常用方法
Nov 11 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 HTML / CSS
position:sticky 粘性定位的几种巧妙应用详解
Apr 24 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
php统计数组元素个数的方法
2015/07/02 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
django使用html模板减少代码代码解析
2017/12/12 Python
Linux下python3.7.0安装教程
2018/07/30 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
python3排序的实例方法
2020/10/20 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
简单通用的简历自我评价
2014/09/21 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python