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?

  •  Základní znalost programovaní v jazyce C/C++.
  •  Vhodný kompilátor (nejlépe vývojové prostředí MS Visual Studio).
  •  Knihovny: Windows.h  GD.h  Stdio.h

 

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  

 
0 # anapael 2021-12-12 10:21
http://slkjfdf.net/ - Ayiqodo Uzkimei zra.izgc.joudov e.8u.cz.aph.gx http://slkjfdf.net/
Odpovědět | Odpovědět citací | Citovat