Javascript 从位图中获取像素
我需要在javascript中处理1000x1000px*.bmp图像(~1MiB)中的像素数据Javascript 从位图中获取像素,javascript,image,canvas,bitmap,pixel,Javascript,Image,Canvas,Bitmap,Pixel,我需要在javascript中处理1000x1000px*.bmp图像(~1MiB)中的像素数据 目前我有点卡住了,因为当我尝试将数据转储到控制台时,页面冻结。 迄今为止的重要准则是: var img = new Image(); img.src = 'image.bmp'; context.drawImage(img, 0, 0); console.log(context.getImageData(0, 0, canvas.height, canvas.width)); 我想这是一个性能问题
目前我有点卡住了,因为当我尝试将数据转储到控制台时,页面冻结。
迄今为止的重要准则是:
var img = new Image();
img.src = 'image.bmp';
context.drawImage(img, 0, 0);
console.log(context.getImageData(0, 0, canvas.height, canvas.width));
我想这是一个性能问题,但是有没有更好的方法来访问像素数据?我真的不需要一次读全部,一个接一个地读像素也可以
编辑:
这是更新后的代码,它将用图片的红色值填充一个2d数组(我正在处理一个黑白图片,这样就足够了)
var img=newimage();
img.src='image.bmp';
drawImage(img,0,0);
var imgData=context.getImageData(0,0,canvas.height,canvas.width);
var pixel=新数组();
对于(i=0;i尝试创建一个1px X 1px的画布,移动图像,然后读取图像数据愚蠢的问题:你是否尝试过先用一个小图像使其工作?你正在向控制台倾倒100万像素,并想知道为什么浏览器会冻结?真的吗?佩卡:是的,我认为这是一个性能问题,如果我知道一种访问方法的话我有一些问题:在$-1行中,它不应该是s/clr/tmr/?,这是什么(x=function(){}());-结构被调用,所以我可以了解更多关于它的信息(谷歌不太擅长使用括号/括号)。我还不会将其标记为答案,因为即使是300fps,这也需要将近1小时。我必须首先测试另一个答案。此外,您的代码有错误:它打印4字节,但只前进1字节,因此输出重叠3字节,最后3个输出将有最后一个值“未定义”,以及它的数据。数据[…]是的,老兄,我承认这是个错误。我是在有点困的时候回答的:)更新了我的帖子。请看我的更新。祝你愉快!(x=function(){})(;
这是一个自动执行的匿名函数,它启动了该函数。帧速率达到[30fps],您至少可以查看图像数据详细信息,而无需挂断浏览器。我不会请求您接受我的答案,因为如果我的答案被接受,甚至被否决,我什么也得不到:)顺便说一句,欢迎使用stackoverflow.com解决冻结问题,但我认为,如果我不转储到控制台,那么性能就足以直接进行所有计算,而不会冻结。
var data = context.getImageData(0, 0, canvas.height, canvas.width);
var count = 0;
var tmr = null;
var length = data.length;
(pix = function() {
var r = data[count + 0];
var g = data[count + 1];
var b = data[count + 2];
var a = data[count + 3];
var rgba = 'rgba(' + r + ' ,' + g + ' ,' + b + ' ,' + a + ')';
console.log(rgba);
if((count += 4) >= length) {
clearTimeout(tmr);
return;
}
tmr = setTimeout(pix, 1000/30); //at 30 fps
})();
var data = context.getImageData(0, 0, canvas.height, canvas.width);
var count = 0;
var tmr = null;
var length = data.length;
(pix = function() {
var r = data[count + 0];
var g = data[count + 1];
var b = data[count + 2];
var a = data[count + 3];
var rgba = 'rgba(' + r + ' ,' + g + ' ,' + b + ' ,' + a + ')';
console.log(rgba);
if((count += 4) >= length) {
clearTimeout(tmr);
return;
}
tmr = setTimeout(pix, 1000/30); //at 30 fps
})();