本文共 1618 字,大约阅读时间需要 5 分钟。
HTML 规范文档为 images 引入了 属性, 通过设置适当的头信息 , 可以从其他站点加载 图片, 并用在 canvas 中,就像从当前站点(current origin)直接下载的一样.
crossorigin
属性的使用细节, 请参考 .
尽管没有CORS授权也可以在 canvas 中使用图像, 但这样做就会污染(taints)画布。 只要 canvas 被污染, 就不能再从画布中提取数据, 也就是说不能再调用 toBlob()
, toDataURL()
和 getImageData()
等方法, 否则会抛出安全错误(security error).
这实际上是为了保护用户的个人信息,避免未经许可就从远程web站点加载用户的图像信息,造成隐私泄漏。
(译者注: 如果用户登陆过QQ等社交网站, 假若不做保护 ,则可能打开某个网站后,该网站利用 canvas 将用户的图片信息获取,上传,进而引发泄露.)
首先, 图片服务器必须设置相应的 Access-Control-Allow-Origin
响应头。添加 img 元素的 crossOrigin 属性来请求头。比如Apache服务器,可以拷贝 中的配置信息, 来进行回应:
SetEnvIf Origin ":" IS_CORS Header set Access-Control-Allow-Origin "*" env=IS_CORS
这些设置生效之后, 就可以像本站的资源一样, 保存其他站点的图片到 之中(或者其他地方)。
var img = new Image, canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), src = "http://example.com/image"; // 具体的图片地址img.crossOrigin = "Anonymous";img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage( img, 0, 0 ); localStorage.setItem( "savedImageData", canvas.toDataURL("image/png") );}img.src = src;// 确保缓存的图片也触发 load 事件if ( img.complete || img.complete === undefined ) { img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; img.src = src;}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 13 | 8 | No support | No support | ? |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | ? | ? | ? | ? | ? |
翻译人员:
翻译日期: 2016年3月29日
原文日期: 2014年9月16日
原文链接:
转载地址:http://rusxa.baihongyu.com/