Frage

Ich brauche ein GIF-Bild in einem C-Programm zu untersuchen. Ich schaute in die Freeimage Bibliothek, aber ich kann es nicht herausgefunden. Könnte jemand ein Beispiel der Verwendung Freeimage gibt in all die kleinen Details zu einem GIF-Bild wie Rahmen zu bekommen, Hintergrund, Transparenz, etc ... Und wie durch den Rahmen zu erhöhen und die Animation der aktuelle Bild / Pixel. Das Problem, das ich habe, ist, dass Sie das Bild in eine FIMULTIBITMAP Art zu laden, während der meisten Funktionen eine FIBITMAP Art nehmen. Ich bin nicht zu sehen, wie Sie sollen die Bibliothek mit Gifs verwenden.

Auch gibt es eine einfachere Bibliothek?

, sagte Ferruccio libgd zu verwenden. Hier ist, was ich mit dieser Bibliothek gefunden.

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

Ich brauche alle Frames.

Im Folgenden Art arbeitet. Das Problem ist, die Bildbreite / Höhenänderung als das tatsächliche Bild kleiner. Ich denke, es ist nur zu zeigen, was sich verändert, aber ich bin nicht sicher, wie das zurück auf das Originalbild zur Karte jede davon Gebrauch zu machen. Hier ist die GIF-Datei .

Eigentlich ist diese Bibliothek nicht funktioniert, wie ich es sollte funktionieren übernehmen. Zum Beispiel kann ich nicht die Palette für das Bild bekommen. Was ich nur Nullen. Irgendwelche Vorschläge auf das?

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

Hier ist der Ausgang. Beachten Sie, wie die Größenänderungen des Bildes.

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

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













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















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

.                       












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















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


.                       
 .                      












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



...                     












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

  .                     
 .                      
.                       












-----
War es hilfreich?

Lösung

Im Code in Ihrer Frage enthalten, sobald Sie die Seite sperren, können Sie tun:

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

Der Zeiger, der FreeImage_LockPage gibt Ihnen ist das Rahmenbild ist. Sie sollten es in eine der anderen Funktionen in der Lage zu verwenden, die die FIBITMAP Art nehmen. (Aber nicht vergessen, in dem obigen Code, Sie öffnete ihn nur lesen)

Sie bereits wissen, wie viele Frames in der Animation sind, „count“ gibt Ihnen das. (Null basiert, natürlich) Es ist ziemlich einfach.

Andere Tipps

Ich habe mit viel Glück hatte LibGD .

Wenn Sie bereit sind, c ++ zu verwenden, ImageMagick hat Bindings, dies zu tun. Es hat eine c api, aber ich sehe keine Funktionen, das zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top