example_node.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // (c) Dean McNamee <dean@gmail.com>, 2013.
  2. // Node omggif example to write out a few example images.
  3. var fs = require('fs');
  4. var omggif = require('./omggif');
  5. // Needs to be large enough for the final full file size. Can be any type of
  6. // buffer that supports [] (an Array, Uint8Array, Node Buffer, etc).
  7. var buf = new Buffer(1024 * 1024);
  8. function gen_static_global() {
  9. var gf = new omggif.GifWriter(buf, 2, 2, {palette: [0xff0000, 0x0000ff]});
  10. gf.addFrame(0, 0, 2, 2,
  11. [0, 1, 1, 0]);
  12. return buf.slice(0, gf.end());
  13. }
  14. function gen_static_local() {
  15. var gf = new omggif.GifWriter(buf, 2, 2);
  16. gf.addFrame(0, 0, 2, 2,
  17. [0, 1, 1, 0],
  18. {palette: [0xff0000, 0x0000ff]});
  19. return buf.slice(0, gf.end());
  20. }
  21. function gen_anim() {
  22. // The loop parameter is the number of times to loop, or 0 for forever.
  23. // A value of 1 will play twice (first time, and then one loop time).
  24. // To play only once do not specify loop or pass null.
  25. var gf = new omggif.GifWriter(buf, 2, 2, {loop: 1});
  26. gf.addFrame(0, 0, 2, 2,
  27. [0, 1, 1, 0],
  28. {palette: [0xff0000, 0x0000ff]});
  29. gf.addFrame(0, 0, 2, 2,
  30. [1, 0, 0, 1],
  31. {palette: [0xff0000, 0x0000ff],
  32. delay: 10}); // Delay in hundredths of a sec (100 = 1s).
  33. return buf.slice(0, gf.end());
  34. }
  35. function gen_gray_strip() {
  36. var gf = new omggif.GifWriter(buf, 256, 1);
  37. var palette = [ ];
  38. var indices = [ ];
  39. for (var i = 0; i < 256; ++i) {
  40. palette.push(i << 16 | i << 8 | i);
  41. indices.push(i);
  42. }
  43. gf.addFrame(0, 0, 256, 1, indices, {palette: palette});
  44. return buf.slice(0, gf.end());
  45. }
  46. // More than 8-bit color (via tiling of several frames). Browsers seem to
  47. // treat this as an animation though, with an enforced minimum time between
  48. // frames which makes it animated instead of the intended static image.
  49. function gen_color_strip() {
  50. var gf = new omggif.GifWriter(buf, 256, 256, {palette: [0x000000, 0xff0000],
  51. background: 1});
  52. var indices = [ ];
  53. for (var i = 0; i < 256; ++i) indices.push(i);
  54. for (var j = 0; j < 256; ++j) {
  55. var palette = [ ];
  56. for (var i = 0; i < 256; ++i)
  57. palette.push(j << 16 | i << 8 | i);
  58. gf.addFrame(0, j, 256, 1, indices, {palette: palette, disposal: 1});
  59. }
  60. return buf.slice(0, gf.end());
  61. }
  62. // 1x1 white, generates the same as Google's 35 byte __utm.gif, except for some
  63. // reason that I'm not sure of they set their background index to 255.
  64. function gen_empty_white() {
  65. var gf = new omggif.GifWriter(buf, 1, 1, {palette: [0xffffff, 0x000000]});
  66. gf.addFrame(0, 0, 1, 1, [0]);
  67. return buf.slice(0, gf.end());
  68. }
  69. // 1x1 transparent 43 bytes.
  70. function gen_empty_trans() {
  71. var gf = new omggif.GifWriter(buf, 1, 1, {palette: [0x000000, 0x000000]});
  72. gf.addFrame(0, 0, 1, 1, [0], {transparent: 0});
  73. return buf.slice(0, gf.end());
  74. }
  75. // with lzw block of 256.
  76. // see: https://github.com/deanm/omggif/issues/5
  77. function gen_block256() {
  78. var width = 4840;
  79. var gf = new omggif.GifWriter(buf, width, 1, {
  80. palette: [0x000000, 0x000000, 0x000000, 0x000000,
  81. 0x000000, 0x000000, 0x000000, 0x000000]
  82. });
  83. var stream = Array(width);
  84. for (var i = 0; i < width; ++i) stream[i] = i & 0x7;
  85. gf.addFrame(0, 0, width, 1, stream, {transparent: 0});
  86. var data = buf.slice(0, gf.end());
  87. // Make sure it decodes.
  88. var gr = new omggif.GifReader(data);
  89. var fi0 = gr.frameInfo(0);
  90. /*
  91. console.log(fi0);
  92. console.log(buf.slice(fi0.data_offset, fi0.data_offset + fi0.data_length));
  93. */
  94. return data;
  95. }
  96. fs.writeFileSync('./test_static_global_palette.gif', gen_static_global());
  97. fs.writeFileSync('./test_static_local_palette.gif', gen_static_local());
  98. fs.writeFileSync('./test_anim.gif', gen_anim());
  99. fs.writeFileSync('./test_gray_strip.gif', gen_gray_strip());
  100. fs.writeFileSync('./test_color_strip.gif', gen_color_strip());
  101. fs.writeFileSync('./test_empty_white.gif', gen_empty_white());
  102. fs.writeFileSync('./test_empty_trans.gif', gen_empty_trans());
  103. fs.writeFileSync('./test_block256.gif', gen_block256());