2010-11-11 12 views
5

Necesito procesar pixeldata de una imagen 1000x1000px * .bmp (~ 1MiB) en javascript
Por el momento estoy un poco atascado, porque la página se congela cuando trato de volcar los datos a la consola .
el código importante hasta el momento:obtener píxeles del mapa de bits

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

supongo que esto es un problema de rendimiento, pero hay una mejor manera de acceder a los datos de píxeles? Realmente no necesito leerlo todo de una vez, leer los píxeles uno por uno también estaría bien.

EDIT:

aquí está el código actualizado, rellenará un 2d-matriz con el rojo-valor de la imagen (estoy tratando con un cuadro negro/blanco, así que eso es suficiente)

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 

no hay problemas de rendimiento :) única peculiaridad es que las filas/columnas se invierten

+2

Pregunta tonta: ¿Has intentado hacerlo primero con una imagen pequeña para que funcione? – epascarello

+4

Está descargando * 1 millón de píxeles * a la consola y preguntándose por qué el navegador se bloquea? ¿Seriamente? –

+1

Pekka: Sí, pensé que era un problema de rendimiento, si supiera cómo acceder a los píxeles uno por uno, no lo habría preguntado. – fruight

Respuesta

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

tengo algunas preguntas: en la línea $ -1, ¿no debería ser s/clr/tmr /? y qué es esto (x = function() {})(); - estructura llamada, por lo que puedo aprender un poco más al respecto (google no es tan bueno con parens/llaves). No lo marcaré como respuesta aún, porque incluso con 300 fps esto toma casi 1 hora. Debo probar la otra respuesta primero. – fruight

+0

también, su código está obstruido: imprime 4bytes, pero solo avanza 1byte, por lo que las salidas se superponen 3bytes, y las últimas 3 salidas tendrán los últimos valores 'indefinidos', y su data.data [...]. – fruight

+0

sí amigo, es un error, lo admito ... Lo había respondido cuando tengo poco sueño :) Actualicé mi publicación. Por favor, eche un vistazo a mi actualización. ¡que tengas un buen día! –

0

Trate de crear un lienzo de 1px 1px X, mover la imagen y luego leer la propiedad imageData

Cuestiones relacionadas