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.