Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

Knihovna ImageMagick - seznámení a ukázka použití v C++.

17.1.2019

ImageMagick je knihovna pro práci s grafickými soubory. Ve srovnání s jinými podobnými knihovnami má některé výhody a specifika. Takovéto hodnocení je samozřejmě vždy trochu subjektivní a závisí na tom, co konkrétně od té které knihovny potřebujeme a očekáváme.

Pro (neprogramující) uživatele poskytuje nástroj volaný z příkazové řádky, pomocí kterého lze aplikovat nejrůznější filtry úpravy grafických souborů.

Popis a dokumentaci samozřejmě najdeme na výše uvedených stránkách. V dalším se budu zabývat knihovnou a jejím programátorským rozhraním.

Velkým plusem je široký výběr programovacích jazyků, pro které knihovna poskytuje rozhraní. Jejich výčet samozřejmě najdete na webu, mě osobně se líbí především možnost využití v C++ a PHP - ukázky kódu které v dalších příspěvcích na tomto webu budu uvádět, budou právě v C++ a PHP.

Knihovna poskytuje rozsáhlý výběr funkcí pro úpravy a nejrůznější efekty a filtry grafických souborů. Za velké plus považuji to, že na rozdíl od jiných podobných knihoven při uložení úprav do souboru jsou v tomto souboru zachovány EXIF informace.

Instalace a nastavení překladače

Příslušné balíčky by měly být k disposici ve standardních repositářích hlavních Linuxových distribucí. Pro vývoj v C++ použijeme knihovnu Magick++, kterou konkrétně v Ubuntu získáme instalací balíčku libmagick++-dev s jeho závislostmi. Pro využití v PHP pak nainstalujeme (kromě samotného balíku php) balík php-imagick.

Samozřejmě na webu knihovny najdeme aktuální verze pro různé jazyky a platformy.

Jednoduchý kód v C++

Následující jednoduchá ukázka kódu používající Magick++ načte zadaný soubor obrázku, převede na stupně šedé a zapíše do jiného souboru. Tento upravený obrázek je pak zobrazen v samostatném okně.

#include <Magick++.h>

int main(int argc, char** argv)
{
	Magick::InitializeMagick(*argv);
	Magick::Image image;
	try
	{
		image.read("karty.jpg");
		image.grayscale(Magick::UndefinedPixelIntensityMethod);
		image.write("karty-gs.jpg");
		image.display();
	}
	catch(Magick::Exception& e)
	{
		printf("%s\n", e.what());
	}
	printf("hotovo");
	getchar();
	return 0;
}

Uvedený kód sestavíme pomocí GCC (resp. G++) příkazem:

g++ magick-cpp.cpp -g `pkg-config --libs --cflags Magick++` -omagick-cpp

Jak je z uvedeného kódu zřejmé, knihovna je napsaná objektově a využívá standardní knihovny jazyka C++ (namespace std) včetně použití výjimek pro detekci chyb. Zde použitá třída výjimky Magick::Exception je odvozena od standardní třídy std::exception.