0.0.3 • Published 13 years ago

chunky-rice v0.0.3

Weekly downloads
3
License
-
Repository
github
Last release
13 years ago

chunky-rice

A streaming PNG chunk decoder / encoder

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.


API

rice = require('chunky-rice')

Returns the rice module.

rice.decode() -> Decoder instance

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

rice.encode() -> Encoder instance

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

rice.chunk(string type, Buffer data) -> Chunk

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!

rice.text(string key, string value) -> Chunk

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

Chunk#type() -> string

Returns the string representation of the chunk type.

Chunk#key() -> string or null

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

Otherwise returns null.

Chunk#value() -> Buffer or null

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

Otherwise returns null.

Chunk#crc() -> integer

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

Chunk#buffer() -> buffer

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).

Chunk#modify(function(ready))

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(err, data) {
              if(err) return ready(err)

              data[0] = 1000
              zlib.deflate(data, function(err, data) {
                if(err) return ready(err)

                // ready accepts (error, Buffer data)
                ready(null, data)            
              })
            })    
          })
        })
    .pipe(rice.encoder())
    .pipe(fs.createWriteStream('thing_out.png'))

License

MIT.

0.0.3

13 years ago

0.0.2

13 years ago

0.0.1

13 years ago