chunky-rice

decode binary streams into PNG chunk objects and back into binary

chunky-rice

 
var rice = require('./index')
  , decoder = rice.decode()
  , encoder = rice.encode()
 
// read a PNG and output a new PNG with metadata 
fs.createReadStream('in.png')
  .pipe(decoder)
    .on('data', function(chunk) {
      if(chunk.type() !== 'IEND') {
        return
      }
 
      // emit a "tEXt" chunk containing metadata 
      // before IEND 
      decoder.emit('data', rice.text('key', JSON.stringify({
        'hello': 'world'
      })))
    })
  .pipe(encoder)
  .pipe(fs.createWriteStream('out.png'))
 

chunky-rice is a module that provides a decoder that takes binary data and outputs Chunk objects (allowing you to manipulate a PNG on the fly); as well as a encoder that takes these Chunk objects and turns them back into a binary stream.

Both the encoder and decoder are through streams.

chunky-rice provides porcelin methods for generating your own chunks, and also, loves you unconditionally.


Returns the rice module.

Creates a binary-to-Chunk through stream. Pausable and resumable.

Creates a Chunk-to-binary through stream. Pausable and resumable.

Creates a Chunk of the provided type with the provided data. CRC and length data is not necessary -- data should only contain the chunk data!

Creates a tEXt chunk with a key of key and a value of value.

Returns the string representation of the chunk type.

If the chunk is a tEXt chunk, returns the key data.

Otherwise returns null.

If the chunk is a tEXt chunk, returns the value data.

Otherwise returns null.

Cached. If not pre-computed, recomputes the CRC of the provided data and type and writes it to the Chunk's backing store.

Cached. Returns the buffer representing the full data of the chunk (to include the 4 byte length, 4 byte type, data segment, and 4 byte CRC).

Modify an in-flight chunk -- only available on chunks sent via decoder data events.

Automatically calls decoder.pause() on its source stream, and decoder.resume() once the ready callback has been called.

    var zlib = require('zlib')
 
    fs.createReadStream('thing.png')
      .pipe(rice.decoder())
        .on('data', function(chunk) {
          if(chunk.type() !== 'IDAT')
            return
 
          chunk.modify(function(ready) {
            zlib.inflate(chunk.data, function(errdata) {
              if(err) return ready(err)
 
              data[0] = 1000
              zlib.deflate(data, function(errdata) {
                if(err) return ready(err)
 
                // ready accepts (error, Buffer data) 
                ready(null, data)            
              })
            })    
          })
        })
    .pipe(rice.encoder())
    .pipe(fs.createWriteStream('thing_out.png'))
 

MIT.