2009-06-21 109 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