Popis třídy CxImage (MFC a C++)

Pokud jste někdy tvořili například obrázkový editor, tak jste jistě potřebovali nějaký nástroj na načítání a ukládání obrázků. Jedna možnost je použít rozhraní IPicture, které je poměrně jednoduché, ale nefunguje na starších systémech. Další možnost je použít knihovnu CxImage, která podporuje načítání skoro všech typů obrázků (JPG, GIF, PNG, TIFF, BMP, ICO, CUR, TGA, ...). Tato knihovna je zdarma k dispozici i se zdrojovými kódy na serveru CodeProject.com a nebo si ji můžete stáhnout na těchto stránkách (konec článku - pozor je to ořezaná verze, takže nenačítá soubory JPEG, PNG, TIFF. Kompletní verzi si musíte stáhnout sami). A jelikož je tato knihovna poměrně rozsáhlá, tak jsem se rozhodl, že vám ji popíši.

Sestavení knihovny

První věc, kterou musíme udělat, je zkompilovat všechny stažené soubory a vytvořit si knihovnu CxImage.lib, kterou potom přilinkujete do projektu. Pokud chcete používat i grafické formáty JPEG, PNG, TIFF, tak do vašeho projektu musíte přidat i tyto knihovny. Poté si do projektu (typu dialogové okno) přidejte členskou proměnnou typu CxImage nazvanou např. m_image.

Otevření obrázku

Při otevírání máme několik možností. Buď funkci předáme název souboru nebo adresu paměti, ve které je soubor načten. Funkce pro načítání jsou následující:

BOOL Load(const TCHAR* file,DWORD imagetype=0);
Načte soubor specifikovaného formátu z disku.

BOOL Decode(BYTE* buffer,DWORD size,DWORD imagetype=0);
Načte soubor určitého formátu z paměti.

Zde je tedy příklad na otevření souboru obrazek.gif:

CxImage image;

if(!image.Load("C:\\obrazek.gif",CXIMAGE_FORMAT_UNKNOWN))
{
  MessageBox("Nepodařilo se načíst soubor!");
  return;
}

...

Pozn. CXIMAGE_FORMAT_UNKNOWN značí, že formát obrázku neznáme a chceme aby jej třída automaticky detekovala.

Uložení obrázku

Při uložení máme opět stejné možnosti jako při načítání, pouze při ukládání do bufferu tento buffer nemusíme alokovat, protože třída jej sama vytvoří, musíme ho ovšem po použití z paměti odstranit.

BOOL Save(const TCHAR * name,DWORD imagetype=0)
Uloží obrázek načtený v proměnné na disk.

BOOL Decode(BYTE* buffer,DWORD size,DWORD imagetype=0);
Uloží obrázek do paměti. Tuto pamět později musíme uvolnit.

Příklad na uložení do paměti:

CxImage image;
... //Načtení obrázku a jeho úprava

BYTE* buffer=NULL;
DWORD size;
image.Encode(buffer,&size);
...
delete[] buffer;

Operace s obrázkem

Třída obsahuje velké množství operací pro různé efekty a dále také možnost přidat si efekty vlastní. Zde je popis těch základních:

BOOL Rotate(float uhel, CxImage* iDst = NULL);
Otočí obrázek v paměti o zadaný úhel. Standardně se změný projeví v proměnné, která tuto funkci zavolala, ale pokud uvedete parametr iDst, tak se změny projeví do této proměnné.

BOOL GrayScale();
Vytvoří černobílý obrázek.

BOOL Negative();
Vytvoří negavitní obrázek.

BOOL IncreaseBpp(DWORD bits);
Zvětší barevnou hloubku obrázku.

Kreslící operace

Další samozřejmá operace je zobrazení obrázku na obrazovku. Zde si můžeme vybrat, zda chceme obrázek nakreslit v originální velikosti nebo zda použijeme Stretching.

LONG Draw(HDC pDC, long x, long y, long xsize=-1,long size=-1,RECT* pClipRect=0);
Nakreslí obrázek v originální velikosti.

LONG Stretch(HDC pDC,long x,long y,long xsize,long ysize,DWORD dwRop=SRCCOPY);
Nakreslí obrázek, šířku a výšku získá z parametrů funkce.

Závěr

Myslím, že jste si udělali alespoň malý obrázek o možnostech této třídy a vyzkoušíte její funkce. Těchto funkcí je opravdu hodně, můžete používat i kódování UNICODE a provádět převody z formátu HBITMAP nebo načítat obrázky z prostředků programu.

Stáhnout třídu CxImage (269kb)

UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.