详解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 相关文章推荐
HTML+CSS3 模仿Windows7 桌面效果
Jun 17 HTML / CSS
IE兼容css3圆角的实现代码
Jul 21 HTML / CSS
利用CSS3的特性改变文本选中时的颜色
Sep 11 HTML / CSS
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
Sep 02 HTML / CSS
css3给背景图片加颜色遮罩的方法
Nov 05 HTML / CSS
html5的localstorage详解
May 09 HTML / CSS
canvas粒子动画背景的实现示例
Sep 03 HTML / CSS
html5 标签
Jul 16 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
Nov 14 HTML / CSS
canvas拼图功能实现代码示例
Nov 21 HTML / CSS
吃透移动端 Html5 响应式布局
Dec 16 HTML / CSS
详解CSS3浏览器兼容
Dec 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
php中使用url传递数组的方法
2015/02/11 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
取得传值的函数
2006/10/27 Javascript
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python 自动去除空行的实例
2018/07/24 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
Jupyter加载文件的实现方法
2020/04/14 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
经销商会议欢迎词
2014/01/11 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
初中地理教学反思
2016/02/19 职场文书
小学三年级作文之写景
2019/11/05 职场文书
redis protocol通信协议及使用详解
2022/07/15 Redis