JavaScript: 在没有画布的情况下获取 ImageData

有没有可能从一个不在画布上而是在 DOM 树中的其他地方的图像中获得一个 ImageData对象作为一个正常的 <img>

如果是,怎么做?

65527 次浏览

你必须在内存中创建一个画布,然后在这个画布上绘制图像:

var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var img = document.getElementById('myimg');
canvas.width = img.width;
canvas.height = img.height;
context.drawImage(img, 0, 0 );
var myData = context.getImageData(0, 0, img.width, img.height);

但是,如果图像来自另一个域,这将不起作用。如果您没有对服务器的控制权,就无法绕过这个安全限制(请注意,如果使用 file://打开 html 文件,就会有很多额外的限制,请使用 http://)

如果你正在使用一个网络工作者,你可以使用 OffscreenCanvas作为替代 document.createElement('canvas')

  var response = await fetch(imageUrl);
var fileBlob = await response.blob();
var bitmap = await createImageBitmap(fileBlob);
var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
var context = canvas.getContext('2d');
context.drawImage(bitmap, 0, 0);
var myData = context.getImageData(0, 0, bitmap.width, bitmap.height);

请注意,对 Offscreen Canvas 的支持是有限的: https://caniuse.com/#feat=offscreencanvas