2010-11-11 2 views
5

Мне нужно обработать pixeldata из изображения 1000x1000px * .bmp (~ 1MiB) в javascript
В настоящее время я немного застрял, потому что страница зависает, когда я пытаюсь сбрасывать данные на консоль ,
важный код до сих пор:получить пиксель из растрового изображения

var img = new Image(); 
img.src = 'image.bmp'; 
context.drawImage(img, 0, 0); 
console.log(context.getImageData(0, 0, canvas.height, canvas.width); 

я думаю, что это проблема производительности, но есть лучший способ получить доступ к данным пикселя? Мне действительно не нужно читать все сразу, чтение пикселов по одному тоже будет хорошо.

EDIT:

здесь обновленный код, он будет заполнить 2d-массив с красной стоимости картины (я имею дело с черно/белое изображение, так что то будет достаточно)

var img = new Image(); 
img.src = 'image.bmp'; 
context.drawImage(img, 0, 0); 
var imgData = context.getImageData(0, 0, canvas.height, canvas.width); 
var pixel = new Array(); 
for(i=0;i<canvas.height;i++){ 
    pixel[i] = new Array(); 
    for(j=0;j<canvas.width;j++){ 
     pixel[i][j] = imgData.data[i*canvas.width+j*4]; 
    } 
} 
//now pixel[y][x] contains the red-value of the pixel at xy in img 

нет проблем с производительностью :) только причуда, что строки/столбцы перепутаны

+2

Глупый вопрос: Вы пытались сделать это с помощью небольшого изображения, чтобы заставить его работать? – epascarello

+4

Вы сбрасываете * 1 миллион пикселей * на консоль и задаетесь вопросом, почему браузер зависает? Шутки в сторону? –

+1

Pekka: Да, я понял, что это проблема с производительностью, если бы я знал способ доступа к пикселям один за другим, я бы не спросил. – fruight

ответ

4
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 
})(); 
+0

У меня есть вопросы: в строке $ -1, не должно быть s/clr/tmr /? и что это (x = function() {})(); - структура называется, поэтому я могу узнать еще об этом (google не так хорош с parens/braces). Я не буду отмечать это как ответ, потому что даже с 300fps это занимает почти 1 час. сначала я должен проверить другой ответ. – fruight

+0

также, ваш код прослушивается: он печатает 4 байта, но только продвигает 1 байт, поэтому выходы перекрываются на 3 байта, а последние 3 выхода будут иметь последние значения «undefined» и его data.data [...]. – fruight

+0

Да чувак, это багги, я признаю, что .. Я ответил на это, когда я немного поспал :) Обновил мой пост. Пожалуйста, посмотрите мое обновление. хорошего дня! – 2010-11-12 01:37:18

0

Попробуйте создать холст 1px X 1px, переместите изображение, а затем читать ImageData

Смежные вопросы