详解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的图层阴影和文字阴影效果使用
Jun 09 HTML / CSS
Css3新特性应用之形状总结
Dec 08 HTML / CSS
css3动画 小球滚动 js控制动画暂停
Nov 29 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
Jun 15 HTML / CSS
纯CSS3实现鼠标滑过按钮动画第二节
Jul 16 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
May 08 HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
Apr 26 HTML / CSS
使用phonegap查找联系人的实现方法
Mar 31 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
Jul 20 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
Aug 03 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
css中:last-child不生效的解决方法
Aug 05 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
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Python中zip函数如何使用
2020/06/04 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
大学生旷课检讨书
2014/01/22 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
硕士生找工作求职信
2014/07/05 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
Python连续赋值需要注意的一些问题
2021/06/03 Python
CSS基础详解
2021/10/16 HTML / CSS