Pergunta

Eu preciso examinar uma imagem GIF em um programa C. Olhei para a biblioteca FreeImage mas eu não consigo entender. Alguém poderia dar um exemplo do uso FreeImage para entrar em todos os pequenos detalhes sobre uma imagem GIF como molduras de fundo, transparência, etc ... E como incremento através dos quadros e obter da animação atual imagem / pixels. O problema que estou tendo é que você carrega a imagem em um tipo FIMULTIBITMAP, enquanto a maioria das funções levar um tipo FIBITMAP. Eu não estou vendo como você deveria usar a biblioteca com gifs.

Além disso, existe uma biblioteca simples?

Ferruccio disse para usar libgd. Aqui está o que eu encontrei com esta biblioteca.

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

Eu preciso de todos os frames.

A seguir é uma espécie de trabalho. O problema é a mudança largura / altura da imagem para ser menor do que a imagem real. Eu acho que é apenas mostrando o que mudou, mas eu não tenho certeza de como mapear que volta para a imagem original para fazer qualquer uso dele. Aqui está o Gif Arquivo .

Na verdade, esta biblioteca não está funcionando como eu suponho que é suposto trabalho. Por exemplo, eu não posso começar a paleta para a imagem. O que eu vejo é todos os zeros. Todas as sugestões sobre isso?

#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);
}

Aqui está a saída. Observe como muda o tamanho da imagem.

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

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













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















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

.                       












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















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


.                       
 .                      












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



...                     












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

  .                     
 .                      
.                       












-----
Foi útil?

Solução

No código incluído na sua pergunta, uma vez que você bloquear a página, você pode fazer:

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

O ponteiro que FreeImage_LockPage lhe dá é a imagem desse quadro. Você deve ser capaz de usá-lo em qualquer uma das outras funções que levam o tipo FIBITMAP. (Mas lembre-se, no código acima, você abri-la somente leitura)

Você já sabe quantos quadros são na animação, "contar" dá-lhe isso. (Baseado em zero, é claro) É muito simples.

Outras dicas

Eu tive sorte com libgd .

Se você estiver disposto a usar c ++, ImageMagick tem ligações de fazer isso. Tem um c api, mas não vejo quaisquer funções para fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top