详解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 实现侧边栏展开收起动画
Dec 22 HTML / CSS
CSS3中使用RGBA设置透明度的示例
Aug 04 HTML / CSS
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
Jan 23 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
Apr 21 HTML / CSS
HTML5 embed 标签使用方法介绍
Aug 13 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
Sep 17 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
Jul 07 HTML / CSS
使用canvas一步步实现图片打码功能的方法
Jun 17 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
Aug 24 HTML / CSS
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
Dec 06 HTML / CSS
CSS3实现360度循环旋转功能
Feb 12 HTML / CSS
CSS实现背景图片全屏铺满自适应的3种方式
Jul 07 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
destoon数据库表说明汇总
2014/07/15 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
JS实现购物车特效
2017/02/02 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python Flask基础教程示例代码
2018/02/07 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
在python中使用nohup命令说明
2020/04/16 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
自主实习接收函
2014/01/13 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
暂住证明怎么写
2015/06/19 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书