Pregunta

Necesito examinar una imagen gif en un programa en C. Miré en la biblioteca de FreeImage pero no puedo entenderlo. ¿Podría alguien dar un ejemplo del uso de FreeImage para entrar en todos los pequeños detalles sobre una imagen gif, como cuadros, fondo, transparencia, etc. Y cómo incrementar a través de los cuadros y obtener la imagen / píxeles actuales de la animación. El problema que tengo es que carga la imagen en un tipo FIMULTIBITMAP, mientras que la mayoría de las funciones toman un tipo FIBITMAP. No veo cómo se supone que debes usar la biblioteca con gifs.

Además, ¿hay una biblioteca más simple?

Ferruccio dijo que usara libGD. Esto es lo que encontré con esta biblioteca.

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

Necesito todos los marcos.

A continuación hay un poco de trabajo. El problema es que el cambio de ancho / alto de la imagen es más pequeño que la imagen real. Creo que solo muestra lo que cambió, pero no estoy seguro de cómo asignar eso de nuevo a la imagen original para hacer uso de ella. Aquí está el Archivo Gif .

En realidad esta biblioteca no funciona como supongo que se supone que debe funcionar. Por ejemplo, no puedo obtener la paleta de la imagen. Lo que obtengo son todos ceros. ¿Alguna sugerencia sobre eso?

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

Aquí está la salida. Observe cómo cambia el tamaño de la imagen.

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

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













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















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

.                       












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















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


.                       
 .                      












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



...                     












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

  .                     
 .                      
.                       












-----
¿Fue útil?

Solución

En el código incluido en su pregunta, una vez que bloquea la página, puede hacer:

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

El puntero que FreeImage_LockPage te da es la imagen de ese marco. Debería poder usarlo en cualquiera de las otras funciones que toman el tipo FIBITMAP. (pero recuerde, en el código anterior, lo abrió como de solo lectura)

Ya sabes cuántos cuadros hay en la animación, "contar" te da eso (basado en cero, por supuesto) Es bastante simple.

Otros consejos

He tenido buena suerte con LibGD .

Si está dispuesto a usar c ++, ImageMagick tiene enlaces para hacerlo. Tiene una api c, pero no veo ninguna función para hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top