2010-11-11 22 views
5

Ho bisogno di elaborare pixeldata da un'immagine 1000x1000px * .bmp (~ 1MiB) in javascript
Al momento sono un po 'bloccato, perché la pagina si blocca quando provo a scaricare i dati nella console .
il codice importante finora:get pixel da bitmap

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

Credo che questo è un problema di prestazioni, ma c'è un modo migliore per accedere ai dati di pixel? Non ho davvero bisogno di leggerlo tutto in una volta, anche leggendo i pixel uno per uno andrebbe bene.

EDIT:

Ecco il codice aggiornato, sarà popolare un 2d-array con il rosso-value del quadro (ho a che fare con una foto in bianco/nero, di modo che è abbastanza)

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 

problemi di prestazioni :) unico vezzo è che righe/colonne sono invertiti

+2

Domanda stupida: hai provato a farlo prima con una piccola immagine per farlo funzionare? – epascarello

+4

Stai scaricando * 1 milione di pixel * sulla console e ti stai chiedendo perché il browser si blocca? Sul serio? –

+1

Pekka: sì, ho pensato che fosse un problema di prestazioni, se conoscessi un modo per accedere ai pixel uno per uno, non avrei chiesto. – fruight

risposta

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

ho alcune domande: nella riga $ -1, non dovrebbe essere s/clr/tmr /? e che cosa è questo (x = function() {})(); - struttura chiamata, quindi posso saperne di più su di esso (google non è così buono con parentesi graffe/parentesi graffe). Non segnerò ancora come risposta, perché anche con 300fps questo richiede quasi 1h. devo prima provare l'altra risposta. – fruight

+0

inoltre, il tuo codice è buggato: stampa 4 byte, ma avanza solo 1 byte, quindi le uscite si sovrappongono a 3 byte e le ultime 3 uscite avranno gli ultimi valori "indefiniti" e i relativi dati.data [...]. – fruight

+0

sì amico, è buggy lo ammetto .. avevo risposto quando ho un po 'sonno :) Aggiornato il mio post. Si prega di dare un'occhiata al mio aggiornamento. buona giornata! –

0

Prova a creare una tela di 1px 1px X, spostare l'immagine e poi leggere l'imageData

Problemi correlati