2009-06-21 139 views
2

我需要检查C程序中的gif图像。我看着FreeImage库,但我无法弄清楚。有人可以举一个使用FreeImage的例子,以了解有关gif图像的所有小细节,例如帧,背景,透明度等......以及如何通过帧增加并获取动画的当前图像/像素。我遇到的问题是将图像加载到FIMULTIBITMAP类型中,而大多数函数采用FIBITMAP类型。我没有看到你应该如何使用GIF图书馆。图像库和gif图像

此外,有一个更简单的库吗?

Ferruccio说使用libGD。这是我在这个库中找到的。

/* These read the first frame only */ 
BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd); 

我需要所有的框架。

下面是一种工作。问题是图像的宽度/高度变化小于实际图像。我认为这只是显示了改变的内容,但我不确定如何将其映射回原始图像以便使用它。这是Gif File

其实这个图书馆的工作不像我认为它应该工作。例如,我无法获得图像的调色板。我得到的是全零。对此有何建议?

#include <stdio.h> 
#include <string.h> 
#include <FreeImage.h> 

int main(int argc, char *argv) { 
     FIMULTIBITMAP *src; 
     src = FreeImage_OpenMultiBitmap(FIF_GIF, "clock_logo_ani.gif", FALSE, TRUE, FALSE, GIF_DEFAULT); 

     int count = FreeImage_GetPageCount(src); 
     int page, i, row, col, background, transparent; 
     RGBQUAD bkcolor; 
     BYTE pixel; 

     char buffer[25*16 + 16]; 

     RGBQUAD *palette; 

     background = 0; 
     for(page = 0; page < count; page++) { 
      FIBITMAP *dib = FreeImage_LockPage(src, page); 
      if(dib) { 
       printf("%dx%d\n", FreeImage_GetHeight(dib), FreeImage_GetWidth(dib)); 
       FreeImage_GetBackgroundColor(dib, &bkcolor); 
       background = (&bkcolor)->rgbReserved; 
       transparent = FreeImage_GetTransparentIndex(dib); 
       memset(buffer, ' ', sizeof(char) * 24 * 16 + 17 * sizeof(char)); 
       for(row = 0; row < 16; row++) { 
         for(col = 0; col < 24; col++) { 
           if (FreeImage_GetPixelIndex(dib, col, row, &pixel)) { 
             if((int)pixel != 0) 
               buffer[row * 25 + col] = '.'; 
           } 

         } 
       } 
       for (row = 0; row < 16; row++) 
         buffer[row * 25 + 25] = '\n'; 
       buffer[row * 25] = '\0'; 
       printf("-----\n%s\n-----\n", buffer); 
       FreeImage_UnlockPage(src, dib, FALSE); 
      } 
     } 

     FreeImage_CloseMultiBitmap(src, GIF_DEFAULT); 
} 

这是输出。注意图像大小如何改变。

16x24 
----- 
      ...   
     .. ..   
     .  .   
     .   .  
    .   .  
    .   .  
    .    .  
    .  ... .  
    .  .  .  
    .  .  .  
    .  .  .  
     . . .  
     .  .   
     .. ..   
      ...   

----- 
4x4 
----- 
.      
.      
    .      













----- 
4x3 
----- 
...      















----- 
4x3 
----- 
    .      
.      

.      












----- 
4x4 
----- 
.       















----- 
4x4 
----- 


.      
.      












----- 
4x4 
----- 



...      












----- 
4x4 
----- 

    .      
.      
.      












----- 

回答

2

在代码中包含了你的问题,一旦你锁定的页面,你可以这样做:

bool isTransparent=FreeImage_IsTransparent(dib); 
RGBQUAD* bkcolor; 
bool didIGetBackgroundCorrectly=FreeImage_GetBackgroundColor(dib, bkcolor); 

是FreeImage_LockPage给你的是,帧的图像的指针。您应该可以在任何采用FIBITMAP类型的其他函数中使用它。 (但是请记住,在上面的代码中,您只能以只读方式打开它)

您已经知道动画中有多少帧,“count”会给出该值。 (当然是基于零)这很简单。

+0

你知道为什么这些帧可以是不同于实际图像的大小吗?我用一些新代码更新了这个问题。 – Scott 2009-06-21 22:20:38

0

我和LibGD祝你好运。

+0

我不认为它适用于我的目的。我用理由编辑了这个问题。 – Scott 2009-06-21 15:03:11

0

如果你愿意使用C++,ImageMagick有绑定来做到这一点。它有一个C API,但我没有看到任何功能来做到这一点。

+0

它必须是C.我忘了ImageMagick。我不怀疑你彻底检查了,但我仍然检查是否有任何C绑定会做我想要的。 :) – Scott 2009-06-21 15:58:58