<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Segmentation Fault! &#187; C++</title>
	<atom:link href="http://www.segmentationfault.es/category/programacion/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.es</link>
	<description>La formulación de un problema es más importante que su solución.</description>
	<lastBuildDate>Tue, 29 Jun 2010 19:45:33 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Efecto &#8220;Fade Out&#8221; con C++ e ImageMagick</title>
		<link>http://www.segmentationfault.es/2009/10/fade-out-cpp-imagemagick/</link>
		<comments>http://www.segmentationfault.es/2009/10/fade-out-cpp-imagemagick/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 07:33:48 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[imagemagick]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[procesamiento de imágenes]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1177</guid>
		<description><![CDATA[Para todos aquellos que os interese el tratamiento de imagen os dejo aquí un breve tutorial sobre cómo implementar el famoso efecto "desvanecer" (Fade Out) utilizando el lenguaje de programación C++ y las librerías de ImageMagick. ¡Saciad vuestra curiosidad y ganas de aprender leyendo el post completo! ]]></description>
			<content:encoded><![CDATA[<p>Llevo algunas semanas realizando una aplicación en C++ con las librerías de tratamiento de imagen de ImageMagick y me he decidido a hacer un tutorial sobre algo que he aprendido desarrollando dicha aplicación. En este breve tutorial pretendo explicaros cómo implementar el conocido efecto &#8220;desvanecer&#8221; (<em>Fade Out</em>) utilizando el lenguaje de programación C++ y trabajando sobre Linux.</p>
<p>Voy a saltarme la explicación sobre cómo instalar las librerías de desarrollo de ImageMagick ya que varía ligeramente de una distribución a otra y no suele ser muy complicado (teniendo en cuenta que ImageMagick suele estar presente en los repositorios más comunes y accesible desde gestores de paquetes como Synaptic). De todas formas si os surge alguna duda utilizad los comentarios.</p>
<p>Para simplificar la aplicación, ésta carecerá de interfaz gráfica y se ejecutará por terminal. El <em>input</em> del programa serán dos imágenes del mismo tamaño y un número entero positivo que indicará el número de imágenes intermedias que queremos que genere el programa como resultado.</p>
<p>Antes de empezar a poneros código fuente os comentaré la estructura de directorios del proyecto. Llamaremos al proyecto <strong>SFFadeOut </strong>(de Segmentation Fault Fade Out), por lo que la carpeta contenedora tendrá ese nombre. Dentro crearemos 4 directorios más:</p>
<ul>
<li>/bin: para los ficheros binarios</li>
<li>/inc: para los <em>headers </em>(.h) a incluir en el proyecto</li>
<li>/obj: para los .o</li>
<li>/src: para los ficheros de código fuente</li>
</ul>
<p>Ahora sí, ¡veamos el código!</p>
<p>En primer lugar os dejo el código de los 2 ficheros que conforman la clase Imagen. Esta clase se encargará de almacenar la información de los píxeles así como de tener algunos métodos y operadores para facilitar el trabajo. Primero os dejo el fichero <em><strong>Imagen.h</strong></em> que estará en /SFFadeOut/inc:</p>
<pre class="brush: cpp; toolbar: true;">
#ifndef IMAGEN_H
#define IMAGEN_H

class Imagen
{
 public:
  int dim[2];
  double * datos;
  Imagen();
  Imagen(int fil, int col);
  Imagen(int fil, int col, double val);
  ~Imagen();

  void  operator=(Imagen &amp;im2);

  int fils(){return dim[0];}
  int cols(){return dim[1];}

  inline double &amp; operator()(int i, int j)
  {
    return(datos[i*dim[1]+j]);
  };

};

Imagen &amp; lee(char * archima, int campo);
int compara_dims(Imagen &amp; im1, Imagen &amp; im2);
void escribe(char * archima, Imagen &amp; imR, Imagen &amp; imG, Imagen &amp; imB);

#endif
</pre>
<p>En éste fichero se encuentra la definición estática de la clase. Podéis ver los atributos de la clase, los constructores, un par de operadores y métodos propios de la clase. A continuación os dejo su correspondiente <strong><em>Imagen.cpp</em></strong>:</p>
<pre class="brush: cpp; toolbar: true;">
#include &lt;Imagen.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;

Imagen::Imagen()
{
  dim[0]=0;
  dim[1]=0;
  datos=new double[1];
}

Imagen::Imagen(int fil, int col)
{
  dim[0]=fil;
  dim[1]=col;
  datos=new double[fil*col];
}

Imagen::Imagen(int fil, int col, double val)
{
  dim[0]=fil;
  dim[1]=col;
  datos=new double[fil*col];
  for(int i=0; i&lt;fil*col;i++)
    datos[i]=val;
}

Imagen::~Imagen()
{
  delete[] datos;
}

void Imagen::operator=(Imagen  &amp;im2)
{
  // este operador no duplica la memoria //
  int fil2=im2.fils();
  int col2=im2.cols();
  if(dim[0]!=fil2 || dim[1]!=col2)
  {
		dim[0]=fil2;
		dim[1]=col2;
		delete[] datos;
		datos=new double[fil2*col2];
	}

  int largo=dim[0]*dim[1];
  for(int i=0; i&lt;largo; i++)
    datos[i]=im2.datos[i];

  return;
}
</pre>
<p>Si os habéis dado cuenta, hay algunas funciones definidas en el header que no están implementadas en el .cpp. El motivo es que vamos a crear otro fichero llamado <strong><em>inout.cpp</em></strong> en el que incluir las funciones de lectura y escritura de imágenes (y también la función para comparar las dimesiones de las imágenes).</p>
<pre class="brush: cpp; toolbar: true;">
#include &lt;Imagen.h&gt;
#include &lt;stdio.h&gt;

#include &lt;Magick++.h&gt;
#include &lt;iostream&gt;
using namespace std;
using namespace Magick;

Imagen  &amp; lee(char * archima, int campo)
{
  string filename(archima);
  Image image;
  image.read(filename);
  Geometry g = image.size();
  int ancho = g.width();
  int alto= g.height();
  double c=1.0/257.0;
  Imagen * im=new Imagen(alto,ancho,(double)0.0);

  for(int i=0;i&lt;alto;i++)
    for(int j=0;j&lt;ancho;j++)
      switch(campo)
      {
        case 0:
          (*im)(i,j)=c*( double (image.pixelColor(j,i).redQuantum()));
          break;
        case 1:
          (*im)(i,j)=c*( double(image.pixelColor(j,i).greenQuantum()));
          break;
        case 2:
          (*im)(i,j)=c*( double(image.pixelColor(j,i).blueQuantum()));
          break;
        default:
          fprintf(stderr,&quot;\n Error en inout.cpp al leer archivo \n&quot;);
          break;
      }

   return(*im);
};

int compara_dims(Imagen &amp; im1, Imagen &amp; im2)
{
  if(im1.fils()!=im2.fils() | im1.cols()!=im2.cols())
    return 0;
  return 1;
};

void escribe(char * archima, Imagen &amp; imR, Imagen &amp; imG, Imagen &amp; imB)
{
    int ancho=imR.cols();
    int alto=imR.fils();
  if(compara_dims(imR,imG)!=1 | compara_dims(imG,imB)!=1 )
    {
      fprintf(stderr,&quot;\n Error al escribir en inout.cpp: imagenes R,G,B con distintas dimensiones. \n&quot;);
      return;
    }

  Geometry geom(ancho,alto);
  Image im(geom,&quot;white&quot;);

  for(int i=0;i&lt;alto;i++)
    for(int j=0;j&lt;ancho;j++)
      {
        double R=imR(i,j);
        double G=imG(i,j);
        double B=imB(i,j);
        R/=255.0;
        G/=255.0;
        B/=255.0;
        ColorRGB col(R,G,B);
              im.pixelColor(j,i,col);
      }

  im.write(archima);
  return;
};
</pre>
<p>Explicar todo el código anterior es bastante complejo por lo que pretendo que lo toméis como una API que supone una capa más de abstracción sobre la librería de ImageMagick. Ahora sí que os dejo la parte interesante, el fichero <strong><em>fadeout.cpp</em></strong> en el cual está el main del programa. Lo primero que realiza es comprobar si son correctos los parámetros de entrada y en caso contrario alertar al usuario. A continuación lee las imágenes y las almacena en objetos de la clase Imagen anteriormente detallada. Crea también un objeto para las imágenes resultantes e intera para cada píxel de cada una de las imágenes resultantes <em>n</em>, realizando el fundido (FadeOut).</p>
<pre class="brush: cpp; toolbar: true;">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;math.h&gt;
#include &lt;sstream&gt;

#include &lt;Imagen.h&gt;
#include &lt;Magick++.h&gt;
#include &lt;iostream&gt;
using namespace std;
using namespace Magick;

void uso()
{
  fprintf(stderr,&quot;Uso: prueba imagen0 imagen1 n \n&quot;);
  exit(1);
};

char * getImagename(int i){
	stringstream temp;

	temp &lt;&lt; &quot;imagen_resultante_&quot; &lt;&lt; i &lt;&lt; &quot;.tiff&quot;;
	string resultName = temp.str();

	char *cstr = new char [resultName.size()+1];
  strcpy (cstr, resultName.c_str());

	return cstr;

}

main(int argc,char **argv)
{

  //verifica que la cantidad de argumentos es correcta
  if(argc&lt;4)
    uso();

  //almacena los argumentos en sus correspondientes variables
  argv++;
  char * nimagen0 =*argv++;
  char * nimagen1 =*argv++;
  int n=atoi(*argv++);

  //lee la primera imagen de entrada
  Imagen im0R=lee(nimagen0,0);
  Imagen im0G=lee(nimagen0,1);
  Imagen im0B=lee(nimagen0,2);

  //lee la segunda imagen de entrada
  Imagen im1R=lee(nimagen1,0);
  Imagen im1G=lee(nimagen1,1);
  Imagen im1B=lee(nimagen1,2);

	int cont;
 	int ancho=im0R.cols();
  int alto=im0R.fils();

	// crea un objeto Imagen para la imagen resultante
	Imagen resultR(ancho, alto);
	Imagen resultG(ancho, alto);
	Imagen resultB(ancho, alto);

	// la primera imagen resultante es la imagen de inicio
  escribe(&quot;imagen_resultante_0.tiff&quot;,im0R,im0G,im0B);

 	// bucle para generar n imágenes resultantes
	for(cont=0; cont &lt;n; cont++){
		// doble bucle que recorre los píxeles
	  for(int i=0;i&lt;alto;i++){
	    for(int j=0;j&lt;ancho;j++){

				// realiza el fundido
      	resultR(i,j) = (float)(((float)(n+1)-(cont+1)) / (float)(n+1)) * im0R(i,j) + (float)((float)(cont+1) / (float)(n+1)) * im1R(i,j);
				resultG(i,j) = (float)(((float)(n+1)-(cont+1)) / (float)(n+1)) * im0G(i,j) + (float)((float)(cont+1) / (float)(n+1)) * im1G(i,j);
				resultB(i,j) = (float)(((float)(n+1)-(cont+1)) / (float)(n+1)) * im0B(i,j) + (float)((float)(cont+1) / (float)(n+1)) * im1B(i,j);
	    }
	  }
		// escribe la imagen resultante n
		escribe(getImagename(cont+1),resultR,resultG,resultB);
	}

	// escribe la imagen final
	escribe(getImagename(cont+1),im1R,im1G,im1B);

	fprintf(stdout,&quot;\n\n Final del programa \n\n&quot;);
}
</pre>
<p>El cuerpo de los bucles es el que realiza el fundido propiamente dicho aplicando la fórmula:</p>
<p><div id="attachment_1186" class="wp-caption aligncenter" style="width: 146px"><img class="size-full wp-image-1186" title="formula_fadeout" src="http://www.segmentationfault.es/wp-content/2009/10/formula_fadeout.png" alt="Fórmula para implementar el fundido." width="136" height="30" /><p class="wp-caption-text">Fórmula para implementar el fundido.</p></div></p>
<p>Para facilitar un poco más la tarea de compilar el programa os dejo también el <a href="http://es.wikipedia.org/wiki/Make" target="_blank">Makefile</a> que yo utilizo:</p>
<pre class="brush: bash; toolbar: true;">
HOME = ..

TARGETS = $(SFFADEOUT)

OBJECTS = $(OBJSFFADEOUT)

###############################
# esto es general

CPP = g++

incdir1 = $(HOME)/inc
incdir2 = /usr/include/ImageMagick
#incdir2 = /usr/include/GraphicsMagick

SRC= $(HOME)/src
OBJ = $(HOME)/obj
bindir=$(HOME)/bin

INCLUDES = -I$(incdir2) -I$(incdir1)

CPPFLAGS = -g -O3

LIBS = -DHAVE_CONFIG_H -D_REENTRANT -D_FILE_OFFSET_BITS=64 -I/usr/include/magick -I/X11 -L/usr/lib -L/usr/X11R6/lib -lMagick++ -ltiff -ljpeg -lpng -lbz2 -lz -lpthread -lm -ldl -lxml2

##########################################
# SFFADEOUT

SFFADEOUT = sffadeout
OBJSFFADEOUT = fadeout.o Imagen.o inout.o

installsffadeout: $(bindir)/$(SFFADEOUT)
$(bindir)/sffadeout: $(OBJ)/sffadeout
	-rm $(bindir)/sffadeout
	cp -p $(OBJ)/sffadeout $(bindir)/sffadeout

sffadeout: $(OBJ)/sffadeout

$(OBJ)/sffadeout: $(addprefix $(OBJ)/, $(OBJSFFADEOUT))
	$(CPP) $(INCLUDES) $(CPPFLAGS) -o $(addprefix $(OBJ)/,$(SFFADEOUT)) $(addprefix $(OBJ)/, $(OBJSFFADEOUT)) -lpthread $(LIBS) $(MesaLibs)

#########################################
# reglas generales

$(OBJ)/%.o : %.cpp
	$(CPP) -c $(INCLUDES) $(CPPFLAGS)  $&amp;amp;lt; -o $@

.PHONY: prueba

all: directorios $(TARGETS)

clean:
	-rm $(TARGETS)
	-rm $(OBJ)/*.o

cleanall: clean

build: clean all

install: $(subst $(OBJ),$(bindir),$(TARGETS))

directorios:
	@if [ ! -d $(bindir) ]; then mkdir $(bindir); fi
	@if [ ! -d $(OBJ) ]; then mkdir $(OBJ); fi
</pre>
<p>Utilizando el comando make sólo deberéis navegar hasta la ruta adecuada y ejecutar el Makefile:</p>
<pre class="brush: bash; toolbar: false;">
make -k sffadeout
</pre>
<p>Recordad que para que todo funcione correctamente debéis ser fieles a la estructura que os he comentado al inicio del post. Es decir, al final debéis tener una estructura de:</p>
<ul>
<li>/SFFadeOut
<ul>
<li>/bin</li>
<li>/inc
<ul>
<li>Imagen.h</li>
</ul>
</li>
<li>/obj</li>
<li>/src
<ul>
<li>fadeout.cpp</li>
<li>Imagen.cpp</li>
<li>inout.cpp</li>
<li>Makefile</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Una vez compilado necesitáis un par de imágenes del mismo tamaño para provar si realmente funciona. Siendo fiel a mis anteriores artículos sobre procesamiento de imagen os animo a provar con la <a href="http://www.segmentationfault.es/wp-content/2009/04/lenna-300x300.png" target="_blank">imagen de Lenna</a> y una<a href="http://www.segmentationfault.es/wp-content/2009/10/negro.jpg" target="_blank"> imagen negra</a>.</p>
<p>Podéis ejecutar el programa con la instrucción (si las imágenes están en el directorio /SFFadeOut):</p>
<pre class="brush: bash; toolbar: false;">
./obj/sffadeout ../lenna.png ../negro.jpg 4
</pre>
<p>El resultado con n=4 debería dar las siguientes imágenes:</p>
<p><div id="attachment_1198" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/10/FadeOutResult.jpg"><img class="size-medium wp-image-1198 " title="FadeOutResult" src="http://www.segmentationfault.es/wp-content/2009/10/FadeOutResult-300x200.jpg" alt="Resultado con n=4." width="300" height="200" /></a><p class="wp-caption-text">Resultado con n=4.</p></div></p>
<p>Os dejo además <a href="http://www.segmentationfault.es/wp-content/2009/10/SFFadeOut.zip" target="_blank">un zip</a> con todo el código estructurado en los directorios correctamente y con las imágenes de prueba que os he comentado. Para obtener mejores resultados probad con una <em>n</em> más alta y si queréis ver el fundido en acción os recomiendo crear un GIF animado.</p>
<p>Espero que os haya parecido interesante y no demasiado complicado. Seguro que hay fallos y mejoras así que os animo a todos a que expreséis vuestra opinión, sugerencias, problemas y demás en los comentarios.</p>
<p>Salu2!</p>
<p><span style="text-decoration: underline;"><strong>Fuentes</strong></span></p>
<p>Marcelo Bertalmío &#8211; http://www.tecn.upf.es/~mbertalmio/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/10/fade-out-cpp-imagemagick/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenGL y GLUT en Visual C++</title>
		<link>http://www.segmentationfault.es/2009/08/opengl-glut-visual-cpp/</link>
		<comments>http://www.segmentationfault.es/2009/08/opengl-glut-visual-cpp/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 21:04:08 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[GLUT]]></category>
		<category><![CDATA[Visual C++]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1112</guid>
		<description><![CDATA[Dado mi anterior post sobre OpenGL y GLUT en XCode, he decidido complementarlo con este nuevo post que explica cómo configurar OpenGL y la librería GLUT en el entorno de desarrollo por excelencia en el mundo de Microsoft Windows, Visual Studio. Porque los programadores del mundo de las ventanas también tienen cabida en este blog.]]></description>
			<content:encoded><![CDATA[<p>Dado<a href="http://www.segmentationfault.es/2009/07/opengl-glut-xcode/" target="_blank"> mi anterior post sobre OpenGL y GLUT en XCode</a>, he decidido complementarlo con este nuevo post que explica cómo configurar OpenGL y la librería GLUT en el entorno de desarrollo por excelencia en el mundo de MS Windows, Visual Studio. En este caso concreto utilizaremos Visual C++ en su versión gratuita, Visual C++ Express Edition 2008, que se puede descargar desde <a href="http://www.microsoft.com/express/vc/Default.aspx" target="_blank">la página web de Microsoft</a>.</p>
<p>Una vez instalado, nos disponemos a descargar la librería GLUT para Win32 desde la página de Nate Robins o directamente desde <a href="http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip" target="_blank">este enlace</a>. Al descomprimir el zip descargado nos encontramos con 4 ficheros y un readme.</p>
<p><div id="attachment_1117" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-2.png"><img class="size-medium wp-image-1117" title="GLUT Files" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-2-300x230.png" alt="Ficheros de la librería GLUT para Win32" width="300" height="230" /></a><p class="wp-caption-text">Ficheros de la librería GLUT para Win32</p></div></p>
<p>A continuación abrimos Visual C++ para empezar a configurarlo para incluir la librería. Primero vamos a<em> Herramientas/Opciones&#8230;</em>.</p>
<p><div id="attachment_1118" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-1.png"><img class="size-medium wp-image-1118" title="Visual C++ Herramientas/Opciones..." src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-1-300x230.png" alt="Vamos a Herramientas/Opciones... para empezar a configurar." width="300" height="230" /></a><p class="wp-caption-text">Vamos a Herramientas/Opciones... para empezar a configurar.</p></div></p>
<p>En la ventana que se nos abre, seleccionamos en el árbol de la izquierda <em>Proyectos y soluciones/Directorios de VC++</em>.</p>
<p><div id="attachment_1119" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-3.png"><img class="size-medium wp-image-1119" title="Visual C++ " src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-3-300x230.png" alt="Seleccionamos Proyectos y soluciones/Directorios de VC++." width="300" height="230" /></a><p class="wp-caption-text">Seleccionamos Proyectos y soluciones/Directorios de VC++.</p></div></p>
<p>En el desplegable de la esquina superior derecha seleccionamos &#8220;<em>Archivos de inclusión</em>&#8220;.</p>
<p><div id="attachment_1120" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-4.png"><img class="size-medium wp-image-1120" title="Visual C++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-4-300x230.png" alt="En el desplegable seleccionamos &quot;Archivos de inclusión&quot;." width="300" height="230" /></a><p class="wp-caption-text">En el desplegable seleccionamos &quot;Archivos de inclusión&quot;.</p></div></p>
<p>Hacemos clic sobre el icono de la carpeta para añadir un nuevo archivo de inclusión que podemos elegir haciendo clic en el botón con los tres puntos suspensivos. Ahí seleccionamos la carpeta de los archivos de glut (<em>glut-3.7.6-bin</em>).</p>
<p><div id="attachment_1122" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-6.png"><img class="size-medium wp-image-1122 " title="Visual c++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-6-300x230.png" alt="Hacemos clic en la carpeta y en el botón de los tres puntos [ . . . ]" width="300" height="230" /></a><p class="wp-caption-text">Elegimos la carpeta glut-3.7.6-bin.</p></div></p>
<p style="text-align: left;">En esta misma ventana seleccionamos ahora &#8220;<em>Archivos de biblioteca</em>&#8221; mediante el mismo procedimiento incluyendo también la carpeta de la librería.</p>
<p><div id="attachment_1123" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-7.png"><img class="size-medium wp-image-1123 " title="Visual C++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-7-300x230.png" alt="Elegimos la carpeta glut-3.7.6-bin." width="300" height="230" /></a><p class="wp-caption-text">Realizamos el mismo procedimiento para archivos de biblioteca.</p></div></p>
<p><div id="attachment_1124" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-9.png"><img class="size-medium wp-image-1124" title="Visual c++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-9-300x230.png" alt="Realizamos el mismo procedimiento para archivos de biblioteca." width="300" height="230" /></a><p class="wp-caption-text">Elegimos la carpeta glut-3.7.6-bin.</p></div></p>
<p style="text-align: left;">Ahora debemos copiar la DLL que se incluye en el paquete de la librería en algún lugar en el que Windows la localice, por ejemplo, en <em>C:\WINDOWS\system32</em>.</p>
<p><div id="attachment_1125" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-12.png"><img class="size-medium wp-image-1125" title="Visual cpp" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-12-300x230.png" alt="Copiamos la glut32.dll en C:\WINDOWS\system32." width="300" height="230" /></a><p class="wp-caption-text">Copiamos la glut32.dll en C:WINDOWSsystem32.</p></div></p>
<p style="text-align: left;">Ahora ya podemos crear un nuevo proyecto vacío mediante el menú <em>Archivo/Nuevo/Proyecto</em>.</p>
<p><div id="attachment_1126" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-13.png"><img class="size-medium wp-image-1126" title="Visual C++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-13-300x230.png" alt="Creamos un proyecto mediante el menú Archivo/Nuevo/Proyecto." width="300" height="230" /></a><p class="wp-caption-text">Creamos un proyecto mediante el menú Archivo/Nuevo/Proyecto.</p></div></p>
<p style="text-align: left;">Elegimos en <em>General</em>, la opción de <em>Proyecto vacío</em> y establecemos un nombre para el proyecto, en este caso &#8220;Segmentation Fault&#8221;.</p>
<p style="text-align: left;">
<p><div id="attachment_1127" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-15.png"><img class="size-medium wp-image-1127" title="Visual C++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-15-300x230.png" alt="Elegimos Proyecto vacío y le damos un nombre." width="300" height="230" /></a><p class="wp-caption-text">Elegimos Proyecto vacío y le damos un nombre.</p></div></p>
<p style="text-align: left;">A continuación, añadimos un fichero en el que incluir el código fuente haciendo clic derecho sobre <em>Archivos de código fuente/Agregar/Nuevo Elemento&#8230;</em>.</p>
<p style="text-align: left;">
<p><div id="attachment_1128" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-16.png"><img class="size-medium wp-image-1128" title="Visual c++" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-16-300x230.png" alt="Añadimos un nuevo fichero." width="300" height="230" /></a><p class="wp-caption-text">Añadimos un nuevo fichero.</p></div></p>
<p>Le damos un nombre al fichero, por ejemplo, <em>main.cpp</em>.</p>
<p style="text-align: left;">
<p><div id="attachment_1133" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-17.png"><img class="size-medium wp-image-1133" title="Imagen 17" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-17-300x230.png" alt="Le damos un nombre al fichero." width="300" height="230" /></a><p class="wp-caption-text">Le damos un nombre al fichero.</p></div></p>
<p style="text-align: left;">En el nuevo fichero podemos incluir una ligera variante del código que propuse en el anterior post que os detallo a continuación:</p>
<p style="text-align: left;">
<p style="text-align: left;">
<pre class="brush: cpp;">
#ifdef WIN32
#include &lt;windows.h&gt;
#endif

//include GLUT
#include &lt;glut.h&gt;

//set the macros for the window size
#define SIZEX 500
#define SIZEY 500

//initializing stuff
void init(void)
{
   glDisable( GL_DEPTH_TEST ); //triangles have two sides
   glDisable( GL_CULL_FACE ); //triangles have two sides
}

//Render one frame
void render(void)
{
   //Clear the window and the depth buffer
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   //Render the triangle
   glBegin(GL_TRIANGLES);
   glColor3f(1.0f, 0.0f, 0.0f ); //change vertex color
   glVertex2d( -0.5f, -0.5f );

   glColor3f(0.0f, 1.0f, 0.0f ); //change vertex color
   glVertex2d( 0.5f, -0.5f );

   glColor3f(0.0f, 0.0f, 1.0f ); //change vertex color
   glVertex2d( 0.0f, 0.5f );
   glEnd();

   //Swap front and back buffer
   glutSwapBuffers();
}

int main(int argc, char **argv)
{
   //init all OpenGL stuff
   glutInit(&amp;argc, argv); //init GLUT
   glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); //init framebuffer properties
   glutInitWindowSize(SIZEX, SIZEY); //init window dimensions
   glutCreateWindow(&quot;Segmentation Fault&quot;);  //create window

   //now that we have the window we can set the opengl state
   init();

   //set the callbacks
   glutDisplayFunc(render);  //render a frame
   glutIdleFunc(render);       //what to do when nothing happens

   //start the GLUT mainloop (this function will be executed in a loop)
   glutMainLoop();

   return 0;
}
</pre>
<p>El resultado debería ser, al igual que en la anterior entrega, un triángulo colorido.</p>
<p><div id="attachment_1135" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/08/Imagen-18.png"><img class="size-medium wp-image-1135" title="Imagen 18" src="http://www.segmentationfault.es/wp-content/2009/08/Imagen-18-300x230.png" alt="Resultado final." width="300" height="230" /></a><p class="wp-caption-text">Resultado final.</p></div></p>
<p>Os recuerdo, como siempre, que tenemos los comentarios para las dudas y problemas que os surjan. Salu2!</p>
<p><span style="text-decoration: underline;"><strong>Fuentes</strong></span></p>
<p><a href="http://www.tecn.upf.edu/~jagenjo/" target="_blank">Javi Agenjo &#8211; http://www.tecn.upf.edu/~jagenjo/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/08/opengl-glut-visual-cpp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>OpenGL y GLUT en Xcode</title>
		<link>http://www.segmentationfault.es/2009/07/opengl-glut-xcode/</link>
		<comments>http://www.segmentationfault.es/2009/07/opengl-glut-xcode/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 08:23:13 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[GLUT]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1003</guid>
		<description><![CDATA[Los programadores que deseen crear programas usando las librerías de OpenGL y GLUT que poseen un Mac no tienen por qué utilizar/emular otros Sistemas Operativos. Pueden hacer uso del entorno de desarrollo propio de Apple, el Xcode, configurándolo siguiendo los pasos de este pequeño tutorial. ]]></description>
			<content:encoded><![CDATA[<p>En primer lugar, quiero decir que este post es bastante específico y, posiblemente, sólo será útil para aquellos programadores que deseen realizar alguna aplicación con la librería gráfica <a href="http://es.wikipedia.org/wiki/OpenGL" target="_blank">OpenGL</a> desde el <a href="http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado" target="_blank">IDE</a> <a href="http://es.wikipedia.org/wiki/Xcode" target="_blank">Xcode</a> de MacOS. En este breve tutorial pretendo indicaros los pasos necesarios para crear un proyecto en C++ haciendo uso de las librerías de OpenGL y <a href="http://es.wikipedia.org/wiki/GLUT" target="_blank">GLUT</a> que incorpora el sistema operativo de Apple.</p>
<p>En primer lugar debemos arrancar el entorno de desarrollo Xcode, por ejemplo desde la carpeta de Aplicaciones, y nos disponemos a crear un nuevo proyecto vacío haciendo clic en <em>File/New Project</em> y posteriormente, en la ventana emergente, <em>Empty Project</em>.</p>
<p><div id="attachment_1010" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/imagen1-2.png"><img class="size-medium wp-image-1010" title="imagen1-2" src="http://www.segmentationfault.es/wp-content/2009/07/imagen1-2-300x93.png" alt="Creamos un nuevo proyecto en Xcode." width="300" height="93" /></a><p class="wp-caption-text">Creamos un nuevo proyecto en Xcode.</p></div></p>
<p><div id="attachment_1009" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-3.png"><img class="size-medium wp-image-1009" title="Imagen 3" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-3-300x256.png" alt="Creamos un nuevo proyecto vacío." width="300" height="256" /></a><p class="wp-caption-text">Seleccionamos proyecto vacío.</p></div></p>
<p>Luego debemos indicar un nombre para el proyecto. Para el ejemplo utilizaremos el nombre de &#8220;SegmentationFault&#8221;.</p>
<p><div id="attachment_1008" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-4.png"><img class="size-medium wp-image-1008" title="Imagen 4" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-4-300x256.png" alt="Damos nombre al proyecto." width="300" height="256" /></a><p class="wp-caption-text">Damos nombre al proyecto.</p></div></p>
<p>Y ya tenemos el proyecto vacío creado. Ahora debemos empezar a configurarlo para que funcione con OpenGL y GLUT. Primero crearemos un nuevo Target, mediante <em>Project/New Target</em> o con el botón derecho encima de <em>Targets</em> y <em>Add/New Target</em>.</p>
<p><div id="attachment_1011" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-6.png"><img class="size-medium wp-image-1011" title="Imagen 6" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-6-300x195.png" alt="Añadimos un nuevo Target al proyecto." width="300" height="195" /></a><p class="wp-caption-text">Añadimos un nuevo Target al proyecto.</p></div></p>
<p>Seleccionamos el tipo del Target como Cocoa Application y especificamos un nombre, por ejemplo, GLUT.</p>
<p><div id="attachment_1012" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-7.png"><img class="size-medium wp-image-1012" title="Imagen 7" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-7-300x256.png" alt="Seleccionamos Cocoa App como tipo de Target." width="300" height="256" /></a> <p class="wp-caption-text">Seleccionamos Cocoa App como tipo de Target. </p></div></p>
<p><div id="attachment_1013" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-8.png"><img class="size-medium wp-image-1013" title="Imagen 8" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-8-300x256.png" alt="Especificamos un nombre para el Target." width="300" height="256" /></a><p class="wp-caption-text">Especificamos un nombre para el Target.</p></div></p>
<p>A continuación se nos muestran las configuraciones por defecto del Target, de las cuales sólo deberemos modificar la entrada de GCC_PREFIX_HEADER para poner el campo en blanco. Recomiendo que utilicéis el buscador para encontrar la opción entre todas las existentes.</p>
<p><div id="attachment_1016" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-9.png"><img class="size-medium wp-image-1016" title="Imagen 9" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-9-300x269.png" alt="Configuración por defecto del nuevo Target." width="300" height="269" /></a><p class="wp-caption-text">Configuración por defecto del nuevo Target.</p></div></p>
<p><div id="attachment_1018" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-101.png"><img class="size-medium wp-image-1018" title="Imagen 10" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-101-300x269.png" alt="Búsqueda de la entrada GCC_PREFIX_HEADER." width="300" height="269" /></a><p class="wp-caption-text">Búsqueda de la entrada GCC_PREFIX_HEADER.</p></div></p>
<p><div id="attachment_1019" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-12.png"><img class="size-medium wp-image-1019" title="Imagen 12" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-12-300x269.png" alt="Eliminamos la información del campo Value." width="300" height="269" /></a><p class="wp-caption-text">Eliminamos la información del campo Value.</p></div></p>
<p>Ahora debemos añadir a nuestro Target, los Frameworks de OpenGL y GLUT incluidos en la libraría del Sistema Operativo. Para ello clic derecho sobre el Target creado y seleccionamos <em>Add/Existing Frameworks&#8230;</em></p>
<p><div id="attachment_1020" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-13.png"><img class="size-medium wp-image-1020" title="Imagen 13" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-13-300x196.png" alt="Añadimos los Frameworks de OpenGL y GLUT." width="300" height="196" /></a><p class="wp-caption-text">Añadimos los Frameworks de OpenGL y GLUT.</p></div></p>
<p>Nos aparecerá una ventana en la que deberemos seleccionar los Frameworks <strong>GLUT.framework</strong> y <strong>OpenGL.framework</strong> alojados en la carpeta <em>/Sistema/Librería/Frameworks </em>de nuestro disco duro. Podemos seleccionar ambos manteniendo pulsada la tecla <strong>cmd</strong> mientras clicamos.</p>
<p><div id="attachment_1022" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-15.png"><img class="size-medium wp-image-1022" title="Imagen 15" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-15-300x222.png" alt="Seleccionamos los frameworks GLUT y OpenGL de /System/Lybrary/Framewoks." width="300" height="222" /></a><p class="wp-caption-text">Seleccionamos los frameworks GLUT y OpenGL de /System/Library/Framewoks.</p></div></p>
<p>En la ventana emergente que aparece después de seleccionarlos no modificamos nada y simplemente clicamos sobre <em>Add</em>.</p>
<p><div id="attachment_1023" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-16.png"><img class="size-medium wp-image-1023" title="Imagen 16" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-16-300x281.png" alt="Continuamos el proceso con las opciones por defecto pulsando Add." width="300" height="281" /></a><p class="wp-caption-text">Continuamos el proceso con las opciones por defecto pulsando Add.</p></div></p>
<p>Ahora ya tenemos configurado nuestro proyecto para que trabaje con las librerías OpenGL y GLUT. A continuación creamos un nuevo fichero de código fuente al proyecto para comprovar que todo funciona correctamente.</p>
<p><div id="attachment_1024" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-17.png"><img class="size-medium wp-image-1024" title="Imagen 17" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-17-300x195.png" alt="Añadimos nuevo fichero de código fuente." width="300" height="195" /></a><p class="wp-caption-text">Añadimos nuevo fichero de código fuente.</p></div></p>
<p>Seleccionamos nuevo fichero vacío en el proyecto y especificamos un nombre, por ejemplo, main.cpp.</p>
<p><div id="attachment_1026" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-18.png"><img class="size-medium wp-image-1026" title="Imagen 18" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-18-300x256.png" alt="Seleccionamos nuevo fichero vacío." width="300" height="256" /></a><p class="wp-caption-text">Seleccionamos nuevo fichero vacío.</p></div></p>
<p><div id="attachment_1027" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-19.png"><img class="size-medium wp-image-1027" title="Imagen 19" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-19-300x256.png" alt="Especificamos un nombre, p.e. main.cpp." width="300" height="256" /></a><p class="wp-caption-text">Especificamos un nombre, p.e. main.cpp.</p></div></p>
<p>En el nuevo fichero podemos poner el código que os muestro a continuación que, si todo el proceso ha ido correctamente, debe renderizar un triángulo en pantalla.</p>
<pre class="brush: cpp;">
//include GLUT
#include &lt;GLUT/glut.h&gt;;

//set the macros for the window size
#define SIZEX 500
#define SIZEY 500

//initializing stuff
void init(void)
{
   glDisable( GL_DEPTH_TEST ); //triangles have two sides
   glDisable( GL_CULL_FACE ); //triangles have two sides
}

//Render one frame
void render(void)
{
   //Clear the window and the depth buffer
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   //Render the triangle
   glBegin(GL_TRIANGLES);
   glColor3f(1.0f, 0.0f, 0.0f ); //change vertex color
   glVertex2d( -0.5f, -0.5f );

   glColor3f(0.0f, 1.0f, 0.0f ); //change vertex color
   glVertex2d( 0.5f, -0.5f );

   glColor3f(0.0f, 0.0f, 1.0f ); //change vertex color
   glVertex2d( 0.0f, 0.5f );
   glEnd();

   //Swap front and back buffer
   glutSwapBuffers();
}

int main(int argc, char **argv)
{
   //init all OpenGL stuff
   glutInit(&amp;amp;argc, argv); //init GLUT
   glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); //init framebuffer properties
   glutInitWindowSize(SIZEX, SIZEY); //init window dimensions
   glutCreateWindow(&quot;Segmentation Fault&quot;);	//create window

   //now that we have the window we can set the opengl state
   init();

   //set the callbacks
   glutDisplayFunc(render);  //render a frame
   glutIdleFunc(render);	     //what to do when nothing happens

   //start the GLUT mainloop (this function will be executed in a loop)
   glutMainLoop();

   return 0;
}
</pre>
<p>Y el resultado debe ser este:</p>
<p><div id="attachment_1032" class="wp-caption aligncenter" style="width: 299px"><a href="http://www.segmentationfault.es/wp-content/2009/07/Imagen-22.png"><img class="size-medium wp-image-1032" title="Imagen 22" src="http://www.segmentationfault.es/wp-content/2009/07/Imagen-22-289x300.png" alt="Triángulo resultante del código del ejemplo." width="289" height="300" /></a><p class="wp-caption-text">Triángulo resultante del código del ejemplo.</p></div></p>
<p>Como siempre os digo, ante cualquier duda sabed que no cobramos por comentar. Salu2! <img src='http://www.segmentationfault.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">Fuentes</span></strong></p>
<p><a href="http://blog.onesadcookie.com/2007/12/xcodeglut-tutorial.html" target="_blank">OneSadCookie &#8211; http://blog.onesadcookie.com/2007/12/xcodeglut-tutorial.html</a></p>
<p><a href="http://www.tecn.upf.edu/~jagenjo/" target="_blank">Javi Agenjo &#8211; http://www.tecn.upf.edu/~jagenjo/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/07/opengl-glut-xcode/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Magick++, haz magia con las imágenes en C++</title>
		<link>http://www.segmentationfault.es/2009/05/magick-imagenes-cpp/</link>
		<comments>http://www.segmentationfault.es/2009/05/magick-imagenes-cpp/#comments</comments>
		<pubDate>Fri, 01 May 2009 09:48:37 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[Magick++]]></category>
		<category><![CDATA[procesamiento de imágenes]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=646</guid>
		<description><![CDATA[¿Hacer zoom a una imagen? ¿Recortarla? Todo eso no tendrá secretos para vosotros a partir de ahora. En este post aprenderéis a procesar todo tipo de imagenes desde C++ gracias a la librería Magick++. ¡Comencémos!]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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++.</p>
<p>Lo primero que deberemos hacer es descargarnos la librería desde la <a href="http://www.imagemagick.org/script/download.php" target="_blank">página web de ImageMagick</a>. Yo he descargado la versión 6.5.1-9, sobre la que se basará el tutorial. La podéis descagar directamente desde <a href="ftp://ftp.fifi.org/pub/ImageMagick/ImageMagick-6.5.1-9.zip" target="_blank">aquí</a>. A continuación os detallaré los pasos para instalar la librería en un entorno UNIX.</p>
<p>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:</p>
<pre class="brush: cpp; toolbar: false;">
unzip ImageMagick-6.5.1-9.zip
</pre>
<p>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.</p>
<pre class="brush: cpp; toolbar: false;">
cd ImageMagick-6.5.1-9
./configure
make
sudo make install
</pre>
<p>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!</p>
<p>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 <a href="http://www.segmentationfault.es/2009/04/quien-es-lenna/" target="_blank">mi anterior post</a>, en esta <a href="http://www.segmentationfault.es/wp-content/2009/04/lenna-300x300.png" target="_blank">URL</a>.</p>
<p>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:</p>
<pre class="brush: cpp;">
#include &lt;Magick++.h&gt;
#include &lt;iostream&gt;

using namespace std;
using namespace Magick;

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

Image myPhoto;

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

// 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(&quot;lenna-recortada.png&quot;);
} catch( Exception &amp;error_ ) {
cout &lt;&lt; 'Ha ocurrido un error: ' &lt;&lt; error_.what() &lt;&lt; endl;
return 1;
}
return 0;
}
</pre>
<p>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:</p>
<pre class="brush: cpp; toolbar: false;">
g++ ejemplo.cc -o ejemplo -l Magick++ &amp;&amp; ./ejemplo
</pre>
<p>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++.</p>
<p>El resultado es el siguiente:</p>
<p><a rel="attachment wp-att-652" href="http://www.segmentationfault.es/wp-content/2009/04/lenna-recortada.png"><img class="aligncenter size-full wp-image-652" title="lenna-recortada" src="http://www.segmentationfault.es/wp-content/2009/04/lenna-recortada.png" alt="lenna-recortada" width="150" height="150" /></a></p>
<p>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 <a href="http://www.imagemagick.org/Magick++/Documentation.html" target="_blank">documentación oficial</a>. ¡Ahora ya sabéis como tratar imágenes desde vuestros programas! Si tenéis dudas utilizad los comentarios.</p>
<p><span style="text-decoration: underline;">Fuentes</span>:</p>
<p>Magick++ &#8211; http://www.imagemagick.org/Magick++/</p>
<p>Wikipedia &#8211; http://es.wikipedia.org/wiki/ImageMagick</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/05/magick-imagenes-cpp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->