UNPKG

gify-parse

Version:

An API for parsing information on (animated) GIF files.

512 lines (488 loc) 13.8 kB
# 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)