1MayMagick++, haz magia con las imágenes en C++

Puede que algunos de vosotros conozcáis ImageMagick, una aplicación de software libre que sirve para crear, editar y componer imágenes. Además es capaz de leer, convertir y guardar imágenes en una gran variedad de formatos.

Pero además de el propio software en sí, existe un conjunto de librerías que nos permite aprovechar las funcionalidades de ImageMagick en nuestras propias aplicaciones. Hay librerías para los lenguajes de programación C, Ch, C++, Java, Lisp, Pascal, Perl, PHP, Python, Ruby y Tcl/Tk, aunque en este post me centraté en la versión para C++: Magick++.

Lo primero que deberemos hacer es descargarnos la librería desde la página web de ImageMagick. Yo he descargado la versión 6.5.1-9, sobre la que se basará el tutorial. La podéis descagar directamente desde aquí. A continuación os detallaré los pasos para instalar la librería en un entorno UNIX.

En primer lugar deberemos descomprimir el archivo. En mi caso he descargado un ZIP, por lo que podemos descomprimirlo mediante la interfaz gráfica o por terminal con:

unzip ImageMagick-6.5.1-9.zip

Una vez descomprimido accedemos al directorio adecuado y podemos observar los archivos de código fuente. Utilizaremos los tres comando básicos para compilar e instalar una librería en UNIX.

cd ImageMagick-6.5.1-9
./configure
make
sudo make install

Si todo ha ido bien, ya deberíamos tener la librería instalada y operativa para usarla en nuestro programa. ¡Vamos manos a la obra!

Para empezar, vamos a descargarnos una imagen sobre la que poder hacer nuestro primer ejemplo. ¿Se os ocurre qué imagen podemos escoger? ¡Sí amigos, Lenna! La podéis obtener de mi anterior post, en esta URL.

Ahora vamos ha realizar un pequeño programa que nos lea la imagen, nos la recorte y nos la guarde con un nombre distinto. El código es el siguiente:

#include <Magick++.h>
#include <iostream>

using namespace std;
using namespace Magick;

int main(int argc, char *argv[]) {

Image myPhoto;

try {
// Leemos la imagen "lenna-300x300.png"
myPhoto.read("lenna-300x300.png");

// Recortamos la imagen manteniendo los 150x150 píxeles
// superiores de la imagen especificando el tamaño
// en el formato (width, height, xOffset, yOffset)
myPhoto.crop( Geometry(150,150, 0, 0) );

// Guardamos la nueva imagen recortada
myPhoto.write("lenna-recortada.png");
} catch( Exception &error_ ) {
cout << 'Ha ocurrido un error: ' << error_.what() << endl;
return 1;
}
return 0;
}

Para compilarlo y ejecutarlo, navegaremos por el terminal hasta el directorio en el que tenemos el código C++ y la imagen descargada, y teclearemos el comando:

g++ ejemplo.cc -o ejemplo -l Magick++ && ./ejemplo

Dónde ejemplo.cc es el nombre del archivo con el código en C++. Utilizamos el compilador g++, que es la versión del archiconocido GCC para el lenguaje orientado a objetos. Con la opción -l Magick++ le indicamos que debe compilar/linkar la libreria Magick++.

El resultado es el siguiente:

lenna-recortada

Como podéis ver hemos conseguido recortar la imagen desde nuestro pequeño programa en C++. La librería nos permite muchísimas más opciones (hacer zoom, colorear, añadir ruido, y un larguísimo etc.) que podéis consultar en la documentación oficial. ¡Ahora ya sabéis como tratar imágenes desde vuestros programas! Si tenéis dudas utilizad los comentarios.

Fuentes:

Magick++ – http://www.imagemagick.org/Magick++/

Wikipedia – http://es.wikipedia.org/wiki/ImageMagick

5 Responses and Counting...

  • Ronald Martinez

    May 1st 2009

    Saludos Gabi

    Intenté todo lo que has hecho y en el último paso, al compilar, obtuve lo siguiente:

    magick001.cpp:1:22: error: Magick++.h: No existe el fichero o el directorio

    además de otros mensajes, que referencias a lo mismo, no reconoce los objetos… por que al parecer no reconoce los archivos de cabecera

    Verifiqué que la instalación esté bien hecha, y las pruebas que se indican en la página de ImageMagick, las he probado y funcionan…

    Parece que tiene que ver con algo de configuración, pero no he podido averiguar que es…

    Espero algún comentario tuyo… desde ya muchas gracias…

  • Gabi García

    Hola Ronald,

    Gracias a tu comentario me acabo de dar cuenta de una errata en mi post (ya que el editor elimina algunos carácteres especiales).

    El error está en la línea de compilar y ejecutar. En el post pone:

    g++ ejemplo.cc -o ejemplo -l Magick++ ./ejemplo

    Lo que en realidad son 2 comandos, el comando que compila y el comando que ejecuta. Para que funcionara falta un doble ampersand antes del comando de ejecución (./ejemplo).

    De todas maneras lo podemos hacer en 2 pasos. Primero compilamos el código junto con la librería mediante:

    g++ ejemplo.cc -o ejemplo -l Magick++

    Si ésta ha sido exitosa, podemos ejecutar nuestra aplicación con:

    ./ejemplo

    Disculpa la errata y espero que tu problema se haya resuelto. En cualquier caso tienes los comentarios a tu entera disposición.

    Un saludo!

  • Ronald Martinez

    Estimada Gabi!

    Gracias por tu pronta respuesta… lamentablemente todavía no he podido solucionar el problemilla… he avanzado algo, pero aún no veo la foto recortada… tal vez, me puedas ayudar…

    Intenté lo que me recomendaste pero no me funcionó: revisando la documentación del Magick ++ encontré:

    c++ -o example example.cpp `Magick++-config –cppflags –cxxflags –ldflags –libs`

    Y esto si me funcionó, obtuve el archivo de salida example…

    pero al ejecutar en la consola el ./example, me envió el siguiente mensaje:

    ./example: error while loading shared libraries: libMagick++.so.2: cannot open shared object file: No such file or directory

    como presumí al momento de compilar y enlazar, el error parecía ser de parámetros de configuración, al no reconocer las cabeceras, eso ya fue solucionado… tal ves esto me sucede, por la distribución que uso, yo uso el Fecora 8, y bueno he desarrollado en C++, pero estoy incursionando en Linux, por motivos de chamba, of course…

    A ver que me puedes decir sobre esto, ok? espero algún comentario tuyo… thanks in advance!!!

  • Gabi García

    Hola Ronald!

    Disculpa que no te haya contestado antes pero he estado un poco liado.

    En primer lugar, deduzco que estás utilizando una versión de la distribución de Linux Fedora. Imagino que tu problema recae en que necesitas algún tipo de librería para poder ejecutar Magick++.

    Yo estoy más familiarizado con las distribuciones Linux basadas en Debian donde herramientas como apt-get, aptitude o el propio Synaptic ayudan mucho, y te permitirían consultar las dependencias.

    Te propongo una cosa. Magick++ es una librería que se basa en el programa de edición de imagen ImageMagick. Yo en tu caso probaría a instalar este software el cual instalará un conjunto de librerías para su correcto funcionamiento y, con algo de suerte, solucionarán tu problema.

    Puedes descargar el paquete en RPM desde la URL: http://www.imagemagick.org/script/binary-releases.php

    ¡Espero que te sirva de ayuda! ¡Un saludo!

  • Ronald Martinez

    Saludos Gabi!

    Bueno, ante todo la disculpa por dejar el hilo de esta consulta en el aire, si bien es cierto, ya solucioné hace un tiempo el problema que acá hemos detallado, recién puedo compartir la solución un tanto rudimentaria que descubrí pero que funcionó…

    Como habías dicho, las librerías del ImageMagick contienen las del Magick++, y desde el inicio yo había instalado esas librerías, o sea, todas! y el problema sucedía aún con esta instalación.

    Haciendo un research! pude darme cuenta que el compilador g++, recurre a ciertas rutas, en las que consulta todas sus dependencias, tales rutas son las siguientes:

    usr/lib
    usr/include
    usr/bin

    Y la instalación de ImageMagick me había proporcionado las siguientes rutas:

    usr/local/lib
    usr/local/include/ImageMagick
    usr/local/bin

    Solo las últimas rutas se encuentra en el PATH, por ello, los comandos de consola respondían, y hasta donde había avanzado pordía compilar la aplicación, gracias a las parámetros de configuración que ya antes he colocado, solo faltaba ejecutarlo…

    Así que probé lo siguiente: si el compilador solo estaba respondiendo a las rutas de las librerías antes mencionadas – las primeras – entonces, algo rudimentario pero lógico, sería pensar que si la librerías del ImageMagick estuvieran ahí, entonces, no habrias problema… así lo hice copié los contenidos de las dos primeras rutas que me dio el ImageMagick en las dos primeras correspondientes – relacionadas al compilador – reemplazando los contenidos, que para el caso, solo se reemplazó una carpeta vacía, y confiando en que no sucedería otra dependencia, compilé de nuevo, y ejecute, y por fin se hizo la luz!!!

    Cabe mencionar que agregué las rutas del ImageMagick al PATH, pero después de varios intentos, nada…

    Levanté una máquina virtual con Ubuntu, y no hubo problema al instalar el ImageMagick con Synaptic; podríamos decir que Fedora, es más “respetuoso” en los procedimientos de instalación, y hay que poner de nuestro lado, igual me ha sucedido para otras instalaciones, tiempo invertido en configurar solo para que trabajen bien…

    Muy bien, agradezco las pautas dadas, será hasta la próxima…