我有一个简单的Pixel
伪类,它有.H()
,.S()
和.L()
方法。我在图像分析中使用它们 - 就像这个水印检测一样:
要从ImageData中获取对象,我只需遍历ImageData并创建多维数组:
//Get image data
var id = ctx.getImageData(0, 0, canvas1.width, canvas1.height);
//The Uint8 array
var pixels = id.data;
//Dimensions
var length = pixels.length;
var width = id.width;
var height = id.height;
//Create empty array for 2D data
var pixels2D = [];
//Loop vertically
for (var y = 0; y < height; y++) {
//Create 2nd level array
pixels2D.push([]);
//Cache the vertical offset
var ofy = y * width;
//Loop horizontally
for (var x = 0; x < width; x++) {
//Calculate X offset
var off = (ofy + x) * 4;
//Create new object
pixels2D[y].push(new Pixel([pixels[off], pixels[off + 1], pixels[off + 2], pixels[off + 3]]));
}
}
对于大图片,这需要一段时间。接着,我发现了Workers
。这似乎是执行异步CPU要求任务的最佳方式,因此我的浏览器不会冻结。
可以pass UInt8Array
to worker - 但是如何检索伪类实例数组呢? javascript中的 Pseudo-Class实例无法序列化......