2012-06-28 70 views
17

¿Hay alguna manera fácil en Node.js de leer un archivo PNG y obtener los píxeles de la imagen? Algo así como node-image, pero a la inversa :)Lectura de una imagen PNG en Node.js

Fui a través de las bibliotecas enumeradas en https://github.com/joyent/node/wiki/modules#wiki-graphics, pero son bien simples envolturas alrededor de las herramientas de línea de comandos que proporcionan cortar y redimensionar o herramientas de dibujo complejo como node-canvas.

+2

¿Por qué no funcionaría '' node-canvas'' para usted? Empuje el png en el lienzo y luego toque los píxeles en el lienzo: http://falcon80.com/HTMLCanvas/PixelManipulation/getImageData.html –

+1

@ david-ellis Gracias, probablemente use esto, pero me pregunto si es una biblioteca que solo lee imágenes. Todo el lienzo con representación de El Cairo parece ser un poco exagerado. –

+0

Probablemente no sea demasiado difícil escribir en una biblioteca, pero teniendo en cuenta qué tan nuevo es Node.js, dudo que tal biblioteca exista todavía. –

Respuesta

18

Ésta hace tanto PNG codificación y decodificación sin dependencias nativas:

pngjs2 - PNG encoder/decoder for Node.js with no native dependencies.

Un ejemplo para invertir los colores de a PNG:

var fs = require('fs'), 
PNG = require('pngjs2').PNG; 

fs.createReadStream('in.png') 
    .pipe(new PNG()) 
    .on('parsed', function() { 

    for (var y = 0; y < this.height; y++) { 
     for (var x = 0; x < this.width; x++) { 
      var idx = (this.width * y + x) << 2; 

      // invert color 
      this.data[idx] = 255 - this.data[idx]; 
      this.data[idx+1] = 255 - this.data[idx+1]; 
      this.data[idx+2] = 255 - this.data[idx+2]; 

      // and reduce opacity 
      this.data[idx+3] = this.data[idx+3] >> 1; 
     } 
    } 

    this.pack().pipe(fs.createWriteStream('out.png')); 
}); 
+1

+1 Creo que prefiero este a mi lib propuesta. ¡Gracias! –

+0

Disculpe, ¿podría echar un vistazo a mi pregunta aquí? Https://stackoverflow.com/questions/46186815/noise-in-png-produced-by-pngjs-for-nodejs? Estoy teniendo problemas con PNG producido por pngjs - es ruidoso ... – kolyaseg

15

estaba a punto de se convirtió en la búsqueda loca, pero me pareció una:

png.js ― A PNG decoder in JS for the canvas element or Node.js.

var PNG = require('png-js'); 

var myimage = new PNG('myimage.png'); 

var width = myimage.width; 
var height = myimage.height; 

myimage.decode(function (pixels) { 
    //Pixels is a 1D array containing pixel data 
}); 

Tenga en cuenta que es pura JavaScript. Funciona tanto en el navegador<canvas> y en Node.JS.

Hay más propiedades aparte de width y height, ver this source.

+0

Oh, esto se ve muy bien, pero cuando llamo a PNG.decode, obtengo una matriz unidimensional de píxeles (de acuerdo con [README] (https://github.com/devongovett/ png.js/blob/master/README.md), [el código] (https://github.com/devongovett/png.js/blob/master/png-node.coffee) y mi prueba simple). ¿Sabes cómo puedo obtener el ancho y la altura?:) –

+0

Sí, el módulo no está muy bien documentado. Actualizaré mi respuesta. –

+1

Aha, gracias, esto está cerca; pero creo que el constructor de PNG espera los bytes reales de la imagen, por lo que debe leer el archivo usted mismo. Puede pegarse en un bucle infinito si le das datos malos, ni siquiera verifica el encabezado PNG, ¡así que ten cuidado con esta biblioteca! –

3

creo

var myimage = new PNG('myimage.png'); 

debería ser

var myimage = new PNG.load('myimage.png'); 
+2

Sí, funciona, pero la acción IO es sincrónica. Creo que la mejor manera es 'fs.readFile (err, data) -> image = new PNG (data)'. –

+0

@honzasp +1 sí, buen punto! –

Cuestiones relacionadas