AES | Deflate | GIF | X-Face | Games


GIF

0. Vorwort

GIF ist ein historisches Datenformat, welches heute noch gerne genutzt und weit verbreitet ist. Bekannteste Features sind die Kompression von Bilddaten (siehe LZW), Animationen und Transparenz in den Grafiken.
Hier möchte ich eine Programmbibliothek anbieten, mit der man GIF-Bilder aus einer unkomprimierten Bitmap erstellen kann.

Zuerst möchte ich in wenigen Worten die Funktionen vorstellen, die ich programmiert habe. Darunter habe ich noch einige einfache Beispiele aufgelistet, die zeigen sollen, dass man auch schon mit wenig Code sehr ansehnliche GIF-Dateien erstellen kann.
Die Bibliothek ist im Moment "minimal", also ermöglichst das erstellen von Grafiken, deckt aber nicht jedes Feature ab, das in GIF89a spezifiziert wird.

Download wgif.zip

1. Kurzanleitung zur Bibliothek

in wgif.h wird eine struct gif_file definiert. Bevor die Funktionen genutzt werden können, müssen die Mitglieder "void *wparm;" und "int (*wr_fnct)(uint8_t *p, size_t len, void *wparm);" gesetzt werden. wr_fnct ist ein Zeiger auf eine vom Nutzer definierte Funktion, die von der Biblothek aufgerufen wird um die erzeugten Daten auszugeben. wparam ist ein frei wählbarer Parameter, der an die Funktion übergeben wird. Ein einfaches Beispiel für wparam und wr_fnct wäre
int schreiben(uint8_t *p, size_t len, void *wparam) {
return fwrite(p, 1, len, (FILE*)wparam);
}
wobei wparam natürlich ein FILE-Pointer ist, in den geschreiben werden kann.

Wenn struct gif_file wie oben beschrieben definiert wurde, können die Funktionen der Bibloithek, wie im Folgenden beschrieben, genutzt werden.

Alle aufgelisteten Funktionen geben zwar int-Werte zurück, diese sind mit Ausnahme von gif_image() immer der Rückgabewert der w_fnct-Funktion. gif_image gibt immer 1 zurück.
int gif_init(struct gif_file *gf, uint16_t width, uint16_t height, uint32_t *colortab, int colortab_sz, uint8_t bgcol_idx)
gif_init() sendet den Anfang der GIF-Datei an die Ausgabefunktion. Es werden die Magic-Bytes, der Logical Screen Descriptor (und falls definiert) die globale Farbtabelle gesendet.

(1) struct gif_file *gf muss wie oben beschrieben definiert werden.

(2) int width und int height bestimmen Höhe und Breite des Bildes

(3) uint32_t *colortab ist ein Zeiger auf das erste Element der globalen Farbtabelle. Die Anzahl der Elemente wird durch int colortab_sz definiert. Jeder Eintrag hat die Form 0xRRGGBB. Falls colortab_sz==0 ist, wird dieser Parameter igoniert und das Bild wird nicht mit einer globalen Farbtabelle ausgestattet.

(4) uint8_t bgcol_idx definiert den Index der Hintergrundfarbe, siehe "18. Logical Screen Descriptor" der GIF-Spezifikation.

int gif_graphicControlExtension(struct gif_file *gf, uint16_t delay_time, int transparent_color)
Setzt eine Graphic Control Extension.
(1) struct gif_file *gf muss so definiert sein wie oben erklärt.

(2) uint16_t delay_time ist die Delay-Time. Angabe in hundertstel Sekunden.

(3) int transparent_color ist der Index der als transparent interpretiert werden soll. Falls -1 übergeben wird, wird diese Option nicht genutzt.

int gif_ext_loop(struct gif_file *gf, uint16_t loops)
Sendet die Application Extension "NETSCAPE2.0". Es wird ein Loop auf die GIF-Datei ausgeführt.

(1) struct gif_file *gf ist wie oben zu definieren.
(2) uint16_t loops ist die Anzahl der ausgeführten Loops oder 0 für unendlich.

int gif_image(struct gif_file *gf, uint16_t imgLeftPos, uint16_t imgTopPos, uint16_t width, uint16_t height, uint32_t *colorTab, int colorTabSz, uint8_t *pixmap)
Mit dieser Funktion wird eine Bitmap in die GIF-Datei eingepflegt.

(1) struct gif_file *gf ist wie oben beschrieben zu initialisieren.

(2) uint16_t imgLeftPos und uint16_t imgTopPos definieren die obere linke Ecke, in der diese Bitmap im Bild beginnt

(3) uint16_t width und uint16_t height definieren Breite und Höhe der Bitmap.

(4) uint32_t *colorTab und int colorTabSz erstellt eine lokale Farbtabelle für die Bitmap. Die Parameter werden analog zur globalen Farbtabelle ind gif_init() verwendet. Wenn colorTabSz==0 ist, wird die globale Farbtabelle verwendet.

(5) uint8_t *pixmap ist der Zeiger auf das Erste Element eines Arrays, das die Bitmap enthält. Jede Zelle des Arrays enthält einen Index aus der zuständigen Farbtabelle. Das Array muss width*height Elemente enthalten. Der Pixel der Koordinate (x, y) befindet sich in pixmap[x+y*width]

int gif_end(struct gif_file *gf)
Mit dem Aufruf von gif_end() sendet man ein ';'-Byte an die wr_fnct-Funktion. Dies definiert das Ende der GIF-Datei.

2. Beispiele

Alle Beispiele als Download (*click*)


helloworld.c gibt ein minimales Beispiel für eine Bitmap.


bresenham.c verwendet den Bresenham-Algorithmus um Linien zu zeichnen. Neben der animierten Ausgabe wird transparenter Hintergrund und die NETSCAPE2.0 Application Extension (loop) verwendet.


pacman.c Fügt Bitmaps ein, die nur einen Teil des Gesamtbildes verdecken (pacman). Außerdem wird die NETSCAPE2.0 Application Extension (loop) verwendet.



nocookies html5
Impressum