Question

Je dois examiner une image gif dans un programme C. J'ai regardé dans la bibliothèque FreeImage mais je n'arrive pas à le comprendre. Quelqu'un pourrait-il donner un exemple d'utilisation de FreeImage pour entrer dans tous les petits détails d'une image gif tels que les images, l'arrière-plan, la transparence, etc. Et comment incrémenter d'une image à l'autre et obtenir l'image / les pixels actuels de l'animation. Le problème que j'ai est que vous chargez l'image dans un type FIMULTIBITMAP, alors que la plupart des fonctions prennent un type FIBITMAP. Je ne vois pas comment vous êtes censé utiliser la bibliothèque avec des gifs.

De plus, existe-t-il une bibliothèque plus simple?

Ferruccio a dit d’utiliser libGD. Voici ce que j'ai trouvé avec cette bibliothèque.

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

J'ai besoin de tous les cadres.

Ci-dessous est une sorte de travail. Le problème est que la largeur / hauteur de l'image change pour être plus petite que l'image réelle. Je pense que cela montre simplement ce qui a changé, mais je ne suis pas sûr de savoir comment mapper cela sur l'image d'origine pour en tirer parti. Voici le fichier GIF .

En fait, cette bibliothèque ne fonctionne pas comme je suppose qu'elle est supposée fonctionner. Par exemple, je ne peux pas obtenir la palette pour l'image. Ce que je reçois, ce sont tous des zéros. Des suggestions à ce sujet?

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

Voici la sortie. Notez comment la taille de l'image change.

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

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













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















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

.                       












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















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


.                       
 .                      












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



...                     












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

  .                     
 .                      
.                       












-----
Était-ce utile?

La solution

Dans le code inclus dans votre question, une fois que vous avez verrouillé la page, vous pouvez effectuer les actions suivantes:

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

Le pointeur que FreeImage_LockPage vous donne est l'image de ce cadre. Vous devriez pouvoir l’utiliser dans n’importe quelle autre fonction prenant le type FIBITMAP. (mais rappelez-vous que dans le code ci-dessus, vous l'avez ouvert en lecture seule)

Vous savez déjà combien d'images sont contenues dans l'animation, " count " vous donne ça. (basé sur zéro, bien sûr) C'est assez simple.

Autres conseils

J'ai eu de la chance avec LibGD .

Si vous souhaitez utiliser c ++, ImageMagick dispose de liens pour le faire. Il a une api c, mais je ne vois aucune fonction pour le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top