[gif] 基于gif.h的gif文件生成

MFC的demo下载 其运行如下图:

[gif] 基于gif.h的gif文件生成

gif.h是一个开源的gif库,整个库只有一个头文件,用于gif文件的生成。其使用非常简单,仅需调用三个函数。

以下是一个简单的demo(待写入的图片数据,是模拟的RGBA数据):

[cpp] view plain copy
  1. #include "stdafx.h"  
  2.   
  3. #include "gif.h"  
  4. #include <windows.h>  
  5.   
  6. #define WIDTH   200  
  7. #define HEIGHT  150  
  8. #define DELAY   50 // 单位是1/100秒钟 即100表示一秒  
  9. #define OUT_FILE "e:\\test.gif"  
  10.   
  11. // 模拟RGBA数据  
  12. void UpdateData(BYTE* data, int length)  
  13. {  
  14.     static int i = 0;  
  15.   
  16.     memset(data, 0, length);  
  17.     for (int x = 0; x < length; x += 4)  
  18.     {  
  19.         int mod = (i % 3);  
  20.         if (mod == 0)  
  21.         {  
  22.             data[x] = 255;  
  23.         }  
  24.         else if (mod == 1)  
  25.         {  
  26.             data[x + 1] = 255;  
  27.         }  
  28.         else  
  29.         {  
  30.             data[x + 2] = 255;  
  31.         }  
  32.     }  
  33.   
  34.     ++i;  
  35. }  
  36.   
  37. int _tmain(int argc, _TCHAR* argv[])  
  38. {    
  39.     int length = WIDTH * HEIGHT * 4; // 4 :仅支持RGBA格式的图像数据 alpha通道会被忽略  
  40.     BYTE* data = new BYTE[length];  
  41.        
  42.     GifWriter writer;  
  43.     if (!GifBegin(&writer, OUT_FILE, WIDTH, HEIGHT, DELAY))  
  44.     {  
  45.         delete[] data;  
  46.         return 1;  
  47.     }  
  48.   
  49.     for (int i = 0; i < 20; ++i)  
  50.     {  
  51.         UpdateData(data, length);  
  52.         GifWriteFrame(&writer, data, WIDTH, HEIGHT, DELAY);  
  53.     }  
  54.   
  55.     GifEnd(&writer);  
  56.     delete[] data;  
  57.   
  58.     return 0;  
  59. }  

备注》

1、经查看gif.h的源码 其写文件使用的是FILE 如果是windows的开发平台,可将FILE改为内存映射,提升文件IO的速度

2、gif.h采用了局部调色板(每个文件均有独立的调色板) 而不是全局调色板 相对于全局调色板 局部调色板的gif图像质量更高 但是占用的内存更多

另外还有一个用于gif文件编解码的开源库:giflib  待后续研究了再发一个demo

MFC的demo下载 其运行如下图:

[gif] 基于gif.h的gif文件生成

gif.h是一个开源的gif库,整个库只有一个头文件,用于gif文件的生成。其使用非常简单,仅需调用三个函数。

以下是一个简单的demo(待写入的图片数据,是模拟的RGBA数据):

[cpp] view plain copy
  1. #include "stdafx.h"  
  2.   
  3. #include "gif.h"  
  4. #include <windows.h>  
  5.   
  6. #define WIDTH   200  
  7. #define HEIGHT  150  
  8. #define DELAY   50 // 单位是1/100秒钟 即100表示一秒  
  9. #define OUT_FILE "e:\\test.gif"  
  10.   
  11. // 模拟RGBA数据  
  12. void UpdateData(BYTE* data, int length)  
  13. {  
  14.     static int i = 0;  
  15.   
  16.     memset(data, 0, length);  
  17.     for (int x = 0; x < length; x += 4)  
  18.     {  
  19.         int mod = (i % 3);  
  20.         if (mod == 0)  
  21.         {  
  22.             data[x] = 255;  
  23.         }  
  24.         else if (mod == 1)  
  25.         {  
  26.             data[x + 1] = 255;  
  27.         }  
  28.         else  
  29.         {  
  30.             data[x + 2] = 255;  
  31.         }  
  32.     }  
  33.   
  34.     ++i;  
  35. }  
  36.   
  37. int _tmain(int argc, _TCHAR* argv[])  
  38. {    
  39.     int length = WIDTH * HEIGHT * 4; // 4 :仅支持RGBA格式的图像数据 alpha通道会被忽略  
  40.     BYTE* data = new BYTE[length];  
  41.        
  42.     GifWriter writer;  
  43.     if (!GifBegin(&writer, OUT_FILE, WIDTH, HEIGHT, DELAY))  
  44.     {  
  45.         delete[] data;  
  46.         return 1;  
  47.     }  
  48.   
  49.     for (int i = 0; i < 20; ++i)  
  50.     {  
  51.         UpdateData(data, length);  
  52.         GifWriteFrame(&writer, data, WIDTH, HEIGHT, DELAY);  
  53.     }  
  54.   
  55.     GifEnd(&writer);  
  56.     delete[] data;  
  57.   
  58.     return 0;  
  59. }  

备注》

1、经查看gif.h的源码 其写文件使用的是FILE 如果是windows的开发平台,可将FILE改为内存映射,提升文件IO的速度

2、gif.h采用了局部调色板(每个文件均有独立的调色板) 而不是全局调色板 相对于全局调色板 局部调色板的gif图像质量更高 但是占用的内存更多

另外还有一个用于gif文件编解码的开源库:giflib  待后续研究了再发一个demo