V tomto článku si uvedeme jednoduchý způsob ukládání snímků formátu GIF, nastavení průhlednosti a rychlosti animace pomocí GD Graphics Library.
Úvod
Grafický formát GIF (Graphics Interchange Format) je určený pro rastrovou grafiku. Využívá se pro jednoduché ukládání například loga a nápisů bez ztrátové komprese LZW (Lempel-Ziv-Welch). Tento typ souboru lze využít i pro krátké animace, čemuž se budeme v tomto článku nejvíce věnovat. GIF má jednu velikou nevýhodu oproti jiným běžným grafickým formátům. Velikost barevné palety je omezen na maximálních 256 barev. Každá barva je složena z 8 bitů RGBA. Oficiální web pro použitou knihovnu GD Library je http://libgd.bitbucket.org/.
Co je potřeba?
Instalace
Ke stažení uvedu mnou ozkoušené GD knihovny: libgd-2.1.0.rar.
Do projektu je nutné připojit knihovny gd.h, bdg.lib, bgd_a.lib a přidat definici BGDWIN32.
#define BGDWIN32 #include <Windows.h> #include <stdio.h> #include <gd.h> #pragma comment(lib, "gd.lib") #pragma comment(lib, "bgd_a.lib")
Formátování obrázku
gdImagePtr im = gdImageCreate(200, 200); // vytvoříme snímek velikost 200x200px if( !im ) // pokud nastane chyba vytvoření snímku, ukončíme akci { printf("Nepodarilo se vytvorit obraz."); return 1; } FILE *out = fopen("Animace.gif", "wb"); // připravíme soubor pro uložení GIF if( !out ) { printf("Nepodarilo se vytvorit soubor pro ulozeni."); return 1; } gdImageGifAnimBegin(im, out, 1, -1); // nastavíme formát GIFu
Do funkce gdImageGifAnimBegin() nastavujeme jako první parametr proměnnou s vytvořeným prvním (inicializačním) obrázkem. Druhý parametr je pointer našeho připraveného souboru, do kterého proběhne ukládání dat. Třetí parametr určuje, zda má být paleta barev globální (tím se sníží celková velikost souboru), nebo pro každý snímek individuální. Čtvrtý parametr určuje počet opakování animace, -1 = jedno přehrání; 0 = nekonečno; 1 = dvě přehrání.
Vytvoření obrázku
for( int i = 0; i < 10; i++ ) { im = gdImageCreate(200, 200); // vytvoříme obrázek 200x200 px int color = gdImageColorAllocate( im, 5+25*i, 255-25*i, 5+25*i ); // alokujeme viditelnou barvu RGB int tran_col = gdImageColorAllocate( im, 0, 0, 0 ); // alokujeme černou barvu RGB (později průhlednou) gdImageFilledRectangle( im, 0, 0, 200, 200, color ); // vytvoříme čtverec přes celý obrázek se zvolenou barvou gdImageFilledRectangle( im, 50, 50, 150, 150, tran_col ); // vytvoříme druhý čtverec s černou barvou gdImageColorTransparent( im, tran_col ); // určíme transparentní barvu černou gdImageGifAnimAdd(im, out, 1, 0, 0, 10, 2, NULL); // uložíme obrázek do souboru gdImageDestroy(im); // odstraníme obrázek z paměti } gdImageGifAnimEnd(out); // ukončíme GIF fclose(out); // zavřeme soubor
Uložíme 10 snímků animace do souboru.
Vytvoření obrázku vždy začíná funkcí gdImageCreate(), do které zadáváme šířku a výšku obrázku v pixelech. Funkce vrací ID obrázku, do kterého budeme následně ukládat data.
Funkcí gdImageColorAllocate() alokujeme jednu z 256 barev palety. Argumenty jsou ID obrázku a barvy 0-255 R,G,B. Funkce nám vrací ID barvy v paletě.
Pro každý snímek animace se vztahuje jedna paleta barev. My však použijeme pouze 2 barvy a to je barva našeho obdélníku a barva černá, která bude závěrem průhledná.
Knihovna obsahuje různé prvky vykreslování do obrázku. My zvolíme fuknci pro vytvoření plného čtverce gdImageFilledRectangle(), do které zadáváme ID obrázku, jeho rozměry x,y,w,h a poslední barvu čtverce. Takto jsme vytvořili dva čtverce, přičemž druhý bude uprostřed obrázku s barvou černou.
Nyní se dostáváme oné funkci, která nám zprůhlední vybranou barvu. Do funkce gdImageColorTransparent() dosadíme ID obrázku a ID barvy, která bude průhledná. V našem případě je to barva černá.
Posledním krokem vytvoření jednoho snímku je zápis obrázku do souboru pomocí funkce gdImageGifAnimAdd(). Zde bych podotkl pouze na 6. parametr funkce, kterým udáváme dobu trvání snímku. Minimum je hodnota 2, což představuje 20ms zpoždění.
Po uložení všech snímků ukončíme zápis a soubor zavřeme.
Komentáře