Domanda

Ho bisogno di esaminare un'immagine GIF in un programma C. Ho guardato nella libreria di FreeImage ma non riesco a capirlo. Qualcuno potrebbe fare un esempio dell'uso di FreeImage per ottenere tutti i piccoli dettagli su un'immagine gif come cornici, sfondo, trasparenza, ecc ... E come incrementare attraverso i frame e ottenere l'immagine / i pixel correnti dell'animazione. Il problema che sto riscontrando è che si carica l'immagine in un tipo FIMULTIBITMAP, mentre la maggior parte delle funzioni accetta un tipo FIBITMAP. Non vedo come dovresti usare la libreria con gif.

Inoltre, esiste una libreria più semplice?

Ferruccio disse di usare libGD. Ecco cosa ho trovato con questa libreria.

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

Ho bisogno di tutti i frame.

Di seguito è riportato il tipo di funzionamento. Il problema è che la modifica della larghezza / altezza dell'immagine deve essere inferiore all'immagine reale. Penso che stia solo mostrando ciò che è cambiato, ma non sono sicuro di come mapparlo indietro sull'immagine originale per farne uso. Ecco il File Gif .

In realtà questa libreria non funziona come suppongo che dovrebbe funzionare. Ad esempio, non riesco a ottenere la tavolozza per l'immagine. Quello che ottengo sono tutti zeri. Qualche suggerimento al riguardo?

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

Ecco l'output. Nota come cambia la dimensione dell'immagine.

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

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













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















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

.                       












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















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


.                       
 .                      












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



...                     












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

  .                     
 .                      
.                       












-----
È stato utile?

Soluzione

Nel codice incluso nella tua domanda, una volta bloccata la pagina, puoi fare:

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

Il puntatore che FreeImage_LockPage ti dà è l'immagine di quel frame. Dovresti essere in grado di usarlo in una qualsiasi delle altre funzioni che accettano il tipo FIBITMAP. (ma ricorda, nel codice sopra, l'hai aperto in sola lettura)

Sai già quanti fotogrammi ci sono nell'animazione, " count " te lo dà. (zero base, ovviamente) È piuttosto semplice.

Altri suggerimenti

Ho avuto fortuna con LibGD .

Se si desidera utilizzare c ++, ImageMagick ha dei vincoli per farlo. Ha un API, ma non vedo alcuna funzione per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top