详解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将文字描边及填充文字颜色的方法
Mar 07 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
Jan 27 HTML / CSS
通过css3的filter滤镜改变png图片的颜色的示例代码
May 06 HTML / CSS
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
Nov 30 HTML / CSS
HTML4和HTML5之间除了相似以外的10个主要不同
Dec 13 HTML / CSS
HTML5 Canvas绘制五星红旗
May 04 HTML / CSS
HTML5 拖放功能实现代码
Jul 14 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
Dec 12 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
Jan 03 HTML / CSS
CSS3实现的侧滑菜单
Apr 27 HTML / CSS
HTML通过表单实现酒店筛选功能
May 18 HTML / CSS
CSS filter 有什么神奇用途
May 25 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开发者事半功倍的十大技巧小结
2010/04/20 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
JavaScript实现简单计算器
2020/03/19 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python搜索指定目录的方法
2015/04/29 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
学校安全检查制度
2014/01/27 职场文书
人事助理自荐信
2014/02/02 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
护士2014年终工作总结
2014/11/11 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Python何绘制带有背景色块的折线图
2022/04/23 Python