Javascript canvas.toDataUrl()遇到SecurityError错误

阅读(14419)

使用canvas保存图片toDataUrl时,比较容易遇到的一个提示:

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': tainted canvases may not be exported.

纠其原因,当引用的图片和当前页面不是同域时,会受 canvas 的同源策略限制。

如果图片源支持CORS,即在输出图片时的HTTP header中包含 Access-Control-Allow-Origin 的授权,那么,可以给<img> 增加 crossOrigin="anonymous" 属性来解决。

var img = document.createElement('img'),
    canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d');
img.onload = function(e) {
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
    var url = canvas.toDataURL();  // Read succeeds, canvas won't be dirty.
};
img.crossOrigin = '';  // no credentials flag. Same as img.crossOrigin='anonymous'
img.src = 'http://xxxxxxx.jpg';

在服务端配置 CORS 的方式,可以参考《Nginx配置支持CORS》

相关阅读:
CORS
W3C CORS
Access-Control-Allow-Origin
Using Cross-domain images in WebGL and Chrome 13