gify-parse
Version:
An API for parsing information on (animated) GIF files.
512 lines (488 loc) • 13.8 kB
Markdown
# gify-parse
A Node.js module for parsing information on (animated) GIF files.
## Notes
**gify-parse** is just a fork of [gify](https://github.com/rfrench/gify) by [rfrench](https://github.com/rfrench/) that is intended to encapsulate the logic into a Node.js module and to provide a command-line interface.
## Installation
Install via [npm](http://npmjs.org/) registry:
$ npm install gify-parse
or
Install via git clone:
$ git clone git://github.com/jonashavers/node-gify-parse.git
$ cd node-gify-parse
$ npm install
## Usage
Usage inside your Node.js modules:
var fs = require('fs');
var gifyParse = require('gify-parse');
var buffer = fs.readFileSync('test.gif');
var gifInfo = gifyParse.getInfo(buffer);
console.log(gifInfo);
Usage of the CLI (command-line interface):
$ gifyParse <file> [option]
e.g.
$ gifyParse test.gif
$ gifyParse test.gif -p duration
$ gifyParse test.gif -p images.0.delay
The examples above parse the file test.gif and print out the GIF file's information on the console.
## Requirements
**gify-parse** requires
* [jDataView](https://github.com/vjeux/jDataView) for reading binary files,
* [commander.js](https://github.com/visionmedia/commander.js/) for the CLI.
## Methods
* **isAnimated**(sourceArrayBuffer) (bool)
* **getInfo**(sourceArrayBuffer) (gifInfo)
## info Properties
* **valid** (bool) - Determines if the GIF is valid.
* **animated** (bool) - Determines if the GIF is animated.
* **globalPalette** (bool) - Determines if the GIF has a global color palette.
* **globalPaletteSize** (int) - Size of the global color palette.
* **globalPaletteColorsRGB** ([r,g,b]) - An array of objects containing the R, G, B values of the color palette. ([Beppe](https://github.com/Beppe))
* **height** (int) - Canvas height.
* **width** (int) - Canvas width.
* **loopCount** (int) - Total number of times the GIF will loop. 0 represents infitine.
* **images** ([images]) - Array of images contained in the GIF.
* **isBrowserDuration** (bool) - If any of the delay times are lower than the [minimum value](http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility), this value will be set to true.
* **duration** (int) - Actual duration calculated from the delay time for each image. If isBrowserDuration is false, you should use this value.
* **durationIE** (int) - Duration for Internet Explorer (16fps)
* **durationSafari** (int) - Duration for Safari in milliseconds (16fps)
* **durationFirefox** (int) - Duration for Firefox in milliseconds (50fps)
* **durationChrome** (int) - Duration for Chrome in milliseconds (50fps)
* **durationOpera** (int) - Duration for Opera in milliseconds (50fps)
## image Properties
* **top** (int) - Image top position (Y).
* **left** (int) - Image left position (X).
* **height** (int) - Image height.
* **width** (int) - Image width.
* **localPalette** (bool) - Image has a local color palette.
* **localPaletteSize** (int) - Size of the local color palette.
* **interlace** (bool) - Image is/is not interlaced.
* **delay** (int) - Delay time in milliseconds.
* **disposal** (int) - Disposal method. (0-7). See [this](http://www.w3.org/Graphics/GIF/spec-gif89a.txt) for more details.
### Example
``` json
{ valid: true,
globalPalette: true,
globalPaletteSize: 256,
globalPaletteColorsRGB:
[ { r: 142, g: 44, b: 14 },
{ r: 109, g: 32, b: 15 },
{ r: 143, g: 37, b: 16 },
{ r: 150, g: 53, b: 17 },
{ r: 56, g: 21, b: 1 },
{ r: 136, g: 41, b: 14 },
{ r: 59, g: 14, b: 0 },
{ r: 140, g: 42, b: 10 },
{ r: 120, g: 68, b: 37 },
{ r: 120, g: 56, b: 36 },
{ r: 102, g: 51, b: 21 },
{ r: 103, g: 54, b: 35 },
{ r: 121, g: 100, b: 75 },
{ r: 154, g: 115, b: 87 },
{ r: 86, g: 51, b: 21 },
{ r: 69, g: 20, b: 3 },
{ r: 177, g: 139, b: 145 },
{ r: 119, g: 72, b: 50 },
{ r: 102, g: 69, b: 39 },
{ r: 86, g: 38, b: 19 },
{ r: 137, g: 99, b: 72 },
{ r: 206, g: 77, b: 80 },
{ r: 165, g: 115, b: 87 },
{ r: 172, g: 52, b: 42 },
{ r: 121, g: 84, b: 55 },
{ r: 220, g: 138, b: 103 },
{ r: 86, g: 36, b: 5 },
{ r: 54, g: 18, b: 1 },
{ r: 135, g: 89, b: 68 },
{ r: 119, g: 88, b: 68 },
{ r: 135, g: 69, b: 52 },
{ r: 157, g: 120, b: 140 },
{ r: 72, g: 36, b: 19 },
{ r: 71, g: 35, b: 5 },
{ r: 102, g: 39, b: 19 },
{ r: 137, g: 104, b: 83 },
{ r: 209, g: 110, b: 77 },
{ r: 151, g: 106, b: 84 },
{ r: 135, g: 54, b: 37 },
{ r: 211, g: 181, b: 210 },
{ r: 174, g: 133, b: 114 },
{ r: 104, g: 71, b: 51 },
{ r: 101, g: 36, b: 5 },
{ r: 107, g: 21, b: 4 },
{ r: 210, g: 107, b: 109 },
{ r: 168, g: 71, b: 52 },
{ r: 254, g: 245, b: 254 },
{ r: 85, g: 36, b: 35 },
{ r: 155, g: 119, b: 100 },
{ r: 86, g: 22, b: 2 },
{ r: 206, g: 82, b: 54 },
{ r: 135, g: 68, b: 36 },
{ r: 182, g: 150, b: 167 },
{ r: 209, g: 85, b: 104 },
{ r: 88, g: 53, b: 35 },
{ r: 134, g: 86, b: 55 },
{ r: 175, g: 103, b: 49 },
{ r: 207, g: 171, b: 182 },
{ r: 229, g: 110, b: 136 },
{ r: 152, g: 104, b: 72 },
{ r: 71, g: 22, b: 18 },
{ r: 153, g: 69, b: 52 },
{ r: 136, g: 53, b: 21 },
{ r: 152, g: 54, b: 37 },
{ r: 204, g: 145, b: 138 },
{ r: 119, g: 38, b: 19 },
{ r: 115, g: 49, b: 7 },
{ r: 242, g: 216, b: 243 },
{ r: 152, g: 69, b: 35 },
{ r: 109, g: 53, b: 72 },
{ r: 118, g: 37, b: 6 },
{ r: 169, g: 56, b: 65 },
{ r: 107, g: 90, b: 67 },
{ r: 136, g: 37, b: 19 },
{ r: 53, g: 7, b: 0 },
{ r: 239, g: 103, b: 113 },
{ r: 103, g: 53, b: 52 },
{ r: 170, g: 46, b: 22 },
{ r: 56, g: 34, b: 6 },
{ r: 182, g: 86, b: 103 },
{ r: 152, g: 52, b: 21 },
{ r: 137, g: 104, b: 102 },
{ r: 152, g: 86, b: 70 },
{ r: 152, g: 119, b: 119 },
{ r: 184, g: 161, b: 208 },
{ r: 170, g: 85, b: 69 },
{ r: 152, g: 100, b: 44 },
{ r: 102, g: 50, b: 6 },
{ r: 151, g: 38, b: 21 },
{ r: 118, g: 55, b: 53 },
{ r: 244, g: 178, b: 139 },
{ r: 152, g: 85, b: 53 },
{ r: 254, g: 206, b: 168 },
{ r: 120, g: 87, b: 85 },
{ r: 139, g: 82, b: 109 },
{ r: 152, g: 86, b: 35 },
{ r: 151, g: 105, b: 102 },
{ r: 233, g: 107, b: 81 },
{ r: 73, g: 50, b: 19 },
{ r: 101, g: 39, b: 36 },
... 156 more items ],
loopCount: 0,
height: 400,
width: 720,
animated: true,
images:
[ { identifier: '0',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '1',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '2',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '3',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '4',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '5',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '6',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '7',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '8',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '9',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '10',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '11',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '12',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '13',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '14',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '15',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '16',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '17',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '18',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '19',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '20',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '21',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '22',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '23',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 },
{ identifier: '24',
localPalette: false,
localPaletteSize: 0,
interlace: false,
comments: [],
text: '',
left: 0,
top: 0,
width: 720,
height: 400,
delay: 40,
disposal: 1 } ],
isBrowserDuration: true,
duration: 1000,
durationIE: 2500,
durationSafari: 1000,
durationFirefox: 1000,
durationChrome: 1000,
durationOpera: 1000 }
```
## Resources
* [What's In A GIF - Bit by Byte](http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp) - Hands down the best write up on GIFs I've found.
* [GIF98](http://www.w3.org/Graphics/GIF/spec-gif89a.txt) - GIF98 RFC.
* [Animated GIF Frame Rate by Browser](http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility) - An awesome breakdown of how each browser renders animated GIFs. Thanks to Jeremiah Johnson for doing the hard work.
* [GIF Format](http://www.onicos.com/staff/iz/formats/gif.html) - GIF blocks.
* [Hexfiend](http://ridiculousfish.com/hexfiend/) - Awesome open source HEX editor (OSX)
## License
Licence: [MIT](LICENSE)