在不创建CORS限制的情况下将HTML插入画布

时间:2014-12-26 03:59:24

标签: javascript google-chrome canvas cors

我正在尝试从画布中获取图像数据,我使用MDN's method添加了HTML元素的数据。插入HTML数据后,我无法访问画布'虽然图像数据(在Chrome中):



//This function is a direct copy of https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas#JavaScript
onload = function() {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');

  var data = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">' +
      '<foreignObject width="100%" height="100%">' +
      '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:14px">' +
      'example' +
      '</div>' +
      '</foreignObject>' +
      '</svg>';

  var DOMURL = window.URL || window.webkitURL || window;

  var img = new Image();
  var svg = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});
  var url = DOMURL.createObjectURL(svg);

  img.onload = function () {
    ctx.drawImage(img, 0, 0);
    DOMURL.revokeObjectURL(url);
    getData(ctx);
  };

  img.src = url;
};

//the part where it goes wrong:
function getData(ctx) {
  try {
    ctx.getImageData(0,0,100,100);
  } catch(e) {
    alert(e);
  }
}
&#13;
<canvas id="canvas"></canvas>
&#13;
&#13;
&#13;

我的问题是:是否可以插入HTML数据,仍然可以访问图像数据?

2 个答案:

答案 0 :(得分:2)

在再看一遍后,我发现data: URI在插入完全相同的HTML后仍然允许访问图像数据。尽管data: URI比blob慢,但这似乎是最好的方式。

&#13;
&#13;
onload = function() {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');

  var data = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">' +
      '<foreignObject width="100%" height="100%">' +
      '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:14px">' +
      'example' +
      '</div>' +
      '</foreignObject>' +
      '</svg>';
  var DOMURL = window.URL || window.webkitURL || window;
  var img = new Image();
  var url = 'data:image/svg+xml;base64,' + btoa(data);

  img.onload = function () {
    ctx.drawImage(img, 0, 0);
    DOMURL.revokeObjectURL(url);
    getData(ctx);
  };
  img.src = url;
};

function getData(ctx) {
  try {
    ctx.getImageData(0,0,100,100);
    alert('Finished without errors');
  } catch(e) {
    alert(e);
  }
}
&#13;
<canvas id="canvas"></canvas>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

不,画布受到SVG的污染,因此不再允许context.getImageData。由于跨域安全问题,这已成为必要。

(有时令人不满意的)解决方法是将html退出服务器并使用无头浏览器(我建议使用PhantomJS)将html转换为图像。然后将该图像提供给客户端。由于html-as-image不是跨域的,因此不会污染画布,您可以使用context.getImageData