<?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>Boozox &#187; Código</title>
	<atom:link href="http://boozox.net/category/codigo/feed/" rel="self" type="application/rss+xml" />
	<link>http://boozox.net</link>
	<description>Blog de informática, programación, software libre, linux, y mucho más</description>
	<lastBuildDate>Tue, 20 Sep 2011 16:20:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Guia básica para editar imágenes en PHP con GD</title>
		<link>http://boozox.net/php/guia-basica-para-editar-imagenes-en-php-con-gd/</link>
		<comments>http://boozox.net/php/guia-basica-para-editar-imagenes-en-php-con-gd/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 11:28:21 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Imagen Digital]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[libreria]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=523</guid>
		<description><![CDATA[Crear y editar imágenes con PHP puede ser muy fácil si tienes instalada la biblioteca GD en tu servidor. Aunque las opciones que ofrece GD son muy básicas, son suficientes para desarrollar scripts con capacidades muy superiores. Ahora voy a presentaros estas funciones básicas con ejemplos, para que puedas crear aplicaciones más complejas. Crear la [...]]]></description>
			<content:encoded><![CDATA[<p>Crear y editar imágenes con PHP <strong>puede ser muy fácil</strong> si tienes instalada la biblioteca GD en tu servidor.</p>
<p>Aunque las opciones que ofrece GD son muy básicas, son suficientes para desarrollar scripts con <strong>capacidades muy superiores</strong>. Ahora voy a presentaros estas <strong>funciones básicas</strong> con ejemplos, para que puedas crear aplicaciones más complejas.</p>
<h2>Crear la imagen de cero o desde un archivo</h2>
<p>Para tratar imágenes en GD trabajamos con recursos o variables tipo resource de imágenes. Esto es una varible que representa a la imagen.</p>
<p>Para crear un nuevo recurso de imagen podemos usar la función <a href="http://es2.php.net/manual/es/function.imagecreate.php">imagecreate()</a> aúnque es más recomendable usar la función <a href="http://es2.php.net/manual/es/function.imagecreatetruecolor.php">imagecreatetruecolor()</a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="nu0">300</span>, <span class="nu0">200</span><span class="br0">&#41;</span>; <span class="co1">//a partir de aqui trabajo con una imagen de 300&#215;200</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$im2</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="nu0">100</span>, <span class="nu0">100</span><span class="br0">&#41;</span>; <span class="co1">//he creado otra imagen distinta con dimensiones 100&#215;100</span></div>
</li>
</ol>
</div>
<p>Si queremos partir de una imagen ya existente, para convertirla en recurso tendremos que usar la función adecuada dependiendo del formato de la imagen. Los principales formatos son JPEG, PNG y GIF; con las funciones <a href="http://es2.php.net/manual/es/function.imagecreatefromjpeg.php">imagecreatefromjpeg()</a>, <a href="http://es2.php.net/manual/es/function.imagecreatefrompng.php">imagecreatefrompng()</a> y <a href="http://es2.php.net/manual/es/function.imagecreatefromgif.php">imagecreatefromgif()</a> respectivamente.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$miJpeg</span> =imagecreatefromjpeg<span class="br0">&#40;</span><span class="st0">&#8216;miimagen.jpg&#8217;</span><span class="br0">&#41;</span>; <span class="co1">//he creado un recurso a partir del archivo miimagen.jpg</span></div>
</li>
</ol>
</div>
<p>Si quieres ahorrarte el pensar a la hora de crear un recurso a partir de imagen, o desconoces el formato de entrada de la imagen (y quieres que lo haga automáticamente) puedes usar esta función para crear cualquier tipo de imagen.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> newimage<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$im</span> = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&#8216;http://&#8217;</span>, <span class="re0">$src</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$im</span> = imagecreatefromstring<span class="br0">&#40;</span> getUrlData<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagealphablending<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagesavealpha<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&#8216;<span class="es0">\.</span>jpg&#8217;</span>, <span class="re0">$src</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$im</span> = imagecreatefromjpeg<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span>; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&#8216;<span class="es0">\.</span>gif&#8217;</span>, <span class="re0">$src</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$imp</span> = imagecreatefromgif<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$x</span> = imagesx<span class="br0">&#40;</span><span class="re0">$imp</span><span class="br0">&#41;</span>; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$y</span> = imagesy<span class="br0">&#40;</span><span class="re0">$imp</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$im</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="re0">$x</span>, <span class="re0">$y</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagefilledrectangle<span class="br0">&#40;</span> <span class="re0">$im</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="re0">$x</span>, <span class="re0">$y</span>, imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">255</span>, <span class="nu0">255</span>, <span class="nu0">255</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagecopy<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="re0">$imp</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="re0">$x</span>, <span class="re0">$y</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&#8216;<span class="es0">\.</span>png&#8217;</span>, <span class="re0">$src</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$im</span> = imagecreatefrompng<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span>; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagealphablending<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagesavealpha<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$im</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">function</span> getUrlData<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$ch</span> = curl_init<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span>, CURLOPT_FAILONERROR, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span>, CURLOPT_CONNECTTIMEOUT, <span class="nu0">30</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$get</span> = curl_exec<span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_close<span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$get</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>[<a href="http://boozox.net/jaula/newimage.phps">descargar código</a>]</p>
<p>Esta función puede crear una imagen a partir de JPEG, PNG, GIF o URL (requiere CURL)</p>
<p>Si queremos saber las dimensiones de un recurso de imagen, usaremos las funciones <strong>imagesx($im)</strong> e <strong>imagesy($im)</strong> que devuelven el <strong>ancho</strong> y <strong>alto</strong> del recurso, en píxeles, respectivamente.</p>
<h2>Copiar, recortar y redimensionar</h2>
<p>La modificación más básica que podemos hacer a una imagen es recortarla y redimensionarla.</p>
<p>En ambos casos la forma de trabajar es, en primer lugar crear un nuevo recurso con las dimensiones apropiadas, y en segundo lugar copiar de la imagen origen a la imagen destino aplicando el cambio deseado.</p>
<h3>Recortar una imagen</h3>
<p>Para recortar una imagen de, por ejemplo, 500 x 400 en 50px por la derecha y por abajo, haremos lo siguiente:</p>
<ol>
<li>Creamos un nuevo recurso de 500 &#8211; 50 = <strong>450</strong> por 400 &#8211; 50 = <strong>350px</strong></li>
<li>Usamos la función imagecopy para copiar de la imagen origen, en nuestra nueva imagen
<p><em>bool <strong>imagecopy</strong>  ( <strong>resource</strong> $im_destino  , <strong>resource</strong> $im_origen  , <strong>int</strong> $pos_x_destino  , <strong>int</strong> $pos_y_destino  , <strong>int</strong> $pos_x_origen  , <strong>int</strong> $pos_y_origen  , <strong>int</strong> $ancho_origen  , <strong>int</strong> $alto_origen  )</em></p>
</li>
<li>Los dos primeros parámetros son los recursos destino y origen</li>
<li>Los dos siguientes son la posición en eje x e y de la imagen destino, donde queremos comenzar a copiar (en nuestro caso 0,0; porque el eje está arriba y a la izquierda)</li>
<li>Los dos siguientes son el ancho y el alto de la imagen que queremos recortar del aimagen original. En nuestro caso 450 y 350.</li>
</ol>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im_origen</span> = imagecreatefromjpeg<span class="br0">&#40;</span><span class="st0">&#8216;mi_imagen.jpg&#8217;</span><span class="br0">&#41;</span>; <span class="co1">//sabemos que mide 500 x 400</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$im_destino</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="nu0">450</span>, <span class="nu0">350</span><span class="br0">&#41;</span>; <span class="co1">//im_destino contendrá la nueva imagen recortada</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">imagecopy<span class="br0">&#40;</span><span class="re0">$im_destino</span>, <span class="re0">$im_origen</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">450</span>, <span class="nu0">350</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Ahora im_destino es im_origen recortada por abajo y por la derecha 50px</span></div>
</li>
</ol>
</div>
<p>[<a href="http://boozox.net/jaula/crop.phps">descargar código</a>] <strong>Ejemplo</strong>: [<a href="http://boozox.net/jaula/img.jpg">original</a>] [<a href="http://boozox.net/jaula/crop.php">recortada dinámicamente</a>]</p>
<h3>Redimensionar una imagen</h3>
<p>En este ejemplo vamos a redimensionar a la mitad la imagen origen, sea cual sea su tamaño.</p>
<p>Crearemos primero un nuevo recurso con las dimexiones x/2 e y/2, y usaremos la función <a href="http://es2.php.net/manual/es/function.imagecopyresampled.php">imagecopyresampled()</a> (también podríamos usar <a href="http://es2.php.net/manual/es/function.imagecopyresized.php">imagecopyresized()</a>, pero la que vamos a usar suaviza los píxeles interpolándolos – tiene mejor calidad)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im_origen</span> = imagecreatefrompng<span class="br0">&#40;</span><span class="st0">&#8216;foo.png&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ancho</span> = imagesx<span class="br0">&#40;</span><span class="re0">$im_origen</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$alto</span> = imagesy<span class="br0">&#40;</span><span class="re0">$im_origen</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$nuevo_ancho</span> = <a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><span class="re0">$ancho</span> / <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$nuevo_alto</span> = <a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><span class="re0">$alto</span> / <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$im_destino</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="re0">$nuevo_ancho</span>, <span class="re0">$nuevo_alto</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">imagecopyresampled<span class="br0">&#40;</span><span class="re0">$im_destino</span>, <span class="re0">$im_origen</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="re0">$nuevo_ancho</span>, <span class="re0">$nuevo_alto</span>, <span class="re0">$ancho</span>, <span class="re0">$alto</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// ahora im_destino es la mitad de grande que im_origen</span></div>
</li>
</ol>
</div>
<h2>Dibujar figuras y texto</h2>
<p>Las figuras que GD nos deja pintar son muy básicas, parecidas a las que ofrece el programa Paint</p>
<p>En este punto lo más importante es crear colores para una imagen. Los colores se deben crear y asociar a una imagen mediante la función <a href="http://es2.php.net/manual/es/function.imagerectangle.php">imagecolorallocate()</a>. El color lo indicamos mediante parámetros <a href="http://es.wikipedia.org/wiki/Modelo_de_color_RGB">RGB</a> (Red Green Blue) que podemos extraer fácilmente de cualquier paleta, como la del Photoshop o el Gimp</p>
<h3>Dibujar un rectángulo</h3>
<p>Quizás la figura más simple. Podemos dibujar sólo el borde del rectángulo con la función <a href="http://es2.php.net/manual/es/function.imagerectangle.php">imagerectangle()</a> o el rectangulo relleno de color, con la función <a href="http://es2.php.net/manual/es/function.imagefilledrectangle.php">imagefilledrectangle()</a></p>
<p> bool <strong>imagerectangle</strong>  ( <strong>resource</strong> $imagen  , <strong>int</strong> $x1  , <strong>int</strong> $y1  , <strong>int</strong> $x2  , <strong>int</strong> $y2  , <strong>int</strong> $color  )</p>
<p> bool <strong>imagefilledrectangle</strong>  ( <strong>resource</strong> $imagen  , <strong>int</strong> $x1  , <strong>int</strong> $y1  , <strong>int</strong> $x2  , <strong>int</strong> $y2  , <strong>int</strong> $color  )</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$imagen</span> = imagecreatefromjpeg<span class="br0">&#40;</span><span class="st0">&#8216;mi_imagen.jpg&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$negro</span> = imagecolorallocate<span class="br0">&#40;</span><span class="re0">$imagen</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//voy a dibujar un rectangulo negro entre las coordenadas (5,5) y (25,15), recuerda que el eje está arriba a la izquierda</span></div>
</li>
<li class="li1">
<div class="de1">imagefilledrectangle<span class="br0">&#40;</span><span class="re0">$imagen</span>, <span class="nu0">5</span>, <span class="nu0">5</span>, <span class="nu0">25</span>, <span class="nu0">15</span>, <span class="re0">$negro</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<h3>Otras figuras</h3>
<p>Existen muchas figuras que puedes dibujar con GD, desde <a href="http://es2.php.net/manual/es/function.imageline.php">una línea</a> hasta un <a href="http://es2.php.net/manual/es/function.imagefilledpolygon.php">polígono</a>, pasando por la <a href="http://es2.php.net/manual/es/function.imagefilledellipse.php">elipse</a> o el <a href="http://es2.php.net/manual/es/function.imagesetpixel.php">píxel</a>. Sólo busca la que más te conviene en la documentación, o combina varias para obtener la figura deseada.</p>
<h3>Escribir texto</h3>
<p>Es <strong>realmente sencillo</strong>. Si no te quieres complicar la vida, puedes usar la función <a href="http://es2.php.net/manual/es/function.imagestring.php">imagestring()</a> que te da la opción de elegir entre <strong>5 fuentes internas</strong> indicando sólo el número de referencia&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im</span> = imagecreate<span class="br0">&#40;</span><span class="nu0">100</span>, <span class="nu0">30</span><span class="br0">&#41;</span>; <span class="co1">//creo una nueva imagen de 100&#215;30</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$fondo</span> = imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">255</span>, <span class="nu0">255</span>, <span class="nu0">255</span><span class="br0">&#41;</span>; <span class="co1">//blanco. El primer color creado, se utiliza como fondo automaticamente para esa imagen</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$color_texto</span> = imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">255</span><span class="br0">&#41;</span>; <span class="co1">//azul</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// escribo la cadena arriba a la izquierda con la fuente #5</span></div>
</li>
<li class="li2">
<div class="de2">imagestring<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">5</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="st0">&quot;¡Hola mundo!&quot;</span>, <span class="re0">$color_texto</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>&#8230; o si quieres <strong>tener más control sobre el estilo</strong>, puedes usar fuentes <a href="http://es.wikipedia.org/wiki/TrueType">TrueType</a> con la función <a href="http://es2.php.net/manual/es/function.imagettftext.php">imagettftext()</a> (en la web <a href="http://www.dafont.com/">DaFont</a> tienes miles de fuentes TrueType gratuitas)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="nu0">400</span>, <span class="nu0">30</span><span class="br0">&#41;</span>; <span class="co1">//creo una nueva imagen de 400&#215;30</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// creo algunos colores</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$blanco</span> = imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">255</span>, <span class="nu0">255</span>, <span class="nu0">255</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$gris</span> &nbsp; = imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">128</span>, <span class="nu0">128</span>, <span class="nu0">128</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$negro</span> &nbsp;= imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">imagefilledrectangle<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">399</span>, <span class="nu0">29</span>, <span class="re0">$blanco</span><span class="br0">&#41;</span>; <span class="co1">//relleno el fondo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// El texto a pintar</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$texto</span> = <span class="st0">&quot;Boozox.net&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// El archivo ttf, escribe la ruta correctamente!!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$fuente</span> = <span class="st0">&#8216;fuente.ttf&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Agrego una sombra al texto</span></div>
</li>
<li class="li1">
<div class="de1">imagettftext<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">20</span>, <span class="nu0">0</span>, <span class="nu0">11</span>, <span class="nu0">21</span>, <span class="re0">$gris</span>, <span class="re0">$fuente</span>, <span class="re0">$texto</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Escribo el texto</span></div>
</li>
<li class="li1">
<div class="de1">imagettftext<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">20</span>, <span class="nu0">0</span>, <span class="nu0">10</span>, <span class="nu0">20</span>, <span class="re0">$negro</span>, <span class="re0">$fuente</span>, <span class="re0">$texto</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>[<a href="http://boozox.net/jaula/ttftext.phps">descargar código</a>]<br />
<strong>Demo:</strong><br />
<img src="http://boozox.net/jaula/ttftext.php"></p>
<h2>Tratar bien la transparencia en PNG</h2>
<p>Las imágenes PNG admiten un <strong>canal Alpha que indica la opacidad</strong> en cada punto de la imagen, para crear efectos semitransparentes. Si te interesa que esta transparencia se muestre correctamente, deberás calentarte un poco más la cabeza, y tener el canal Alpha siempre en cuenta. Te aconsejo que incluyas <strong>estas dos líneas</strong> después de crear una nueva imagen con transparencia (aunque tendrás que estar siempre atento de que el canal alpha no se pierda!)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$im</span> = imagecreatefrompng<span class="br0">&#40;</span><span class="st0">&#8216;mi_transparencia.png&#8217;</span><span class="br0">&#41;</span>; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//conservar transparencia</span></div>
</li>
<li class="li1">
<div class="de1">imagealphablending<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">imagesavealpha<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Recuerda también que puedes <strong>crear colores con canal de transparencia</strong> usando <a href="http://es2.php.net/manual/es/function.imagecolorallocatealpha.php">imagecolorallocatealpha()</a> en lugar de imagecolorallocate()</p>
<h2>Exportar la imagen para visualizarla</h2>
<p>Después de haber modificado nuestra imagen tal como deseamos, tendremos que <strong>exportarla</strong>. Existe una función para cada formato de salida (<a href="http://es2.php.net/manual/es/function.imagejpeg.php">imagejpeg()</a>, <a href="http://es2.php.net/manual/es/function.imagepng.php">imagepng()</a>, <a href="http://es2.php.net/manual/es/function.imagegif.php">imagegif()</a>, etc&#8230;). Personalmente te recomiendo siempre <strong>exportar en PNG</strong> porque se conserva la <strong>calidad</strong> y la <strong>nitidez</strong> mucho mejor.</p>
<p>En todos los casos tendremos la opción de generar el código de la imagen, si queremos que el archivo PHP simule ser la propia imagen, o indicarle dónde queremos que almacene la imagen resultado.</p>
<p>Para el primer caso, tendremos que indicar mediante las cabeceras que lo que estamos a punto de mostrar <strong>es una imagen</strong>. Para esto usamos la función header() indicando el tipo de archivo en concreto de que se trata (image/jpeg, image/png o image/gif).</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//este codigo se incluiria al final del proceso de edicion, suponiendo que $im es el recurso de la imagen que queremos mostrar</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Content-type: image/png&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">imagepng<span class="br0">&#40;</span><span class="re0">$im</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Una vez creado este archivo, podemos mostrar el resultado en una página HTML <strong>simplemente creando una etiqueta de imagen</strong> que referencie a ese archivo .php</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;img src=&quot;imagen.php&quot; /&gt;</div>
</li>
</ol>
</div>
<p>Si queremos <strong>almacenar en nuestro disco</strong> la imagen resultante, tendremos que pasar como segundo parámetro a la función el nombre del archivo que queremos generar.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">imagepng<span class="br0">&#40;</span><span class="re0">$im</span>,<span class="st0">&#8216;ruta/miarchivo.png&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><strong style="font-size:1.4em;">Recuerda que me interesa mucho tu opinión. Crees que falta algo? tienes dudas? vas a trabajar con la librería GD ahora que sabes cómo funciona? has hecho experimentos curiosos con imágenes dinámicas? &#8230;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/guia-basica-para-editar-imagenes-en-php-con-gd/feed/</wfw:commentRss>
		<slash:comments>53</slash:comments>
		</item>
		<item>
		<title>Redimensionar en PHP a tamaño fijo</title>
		<link>http://boozox.net/php/redimensionar-en-php-a-tamano-fijo/</link>
		<comments>http://boozox.net/php/redimensionar-en-php-a-tamano-fijo/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 15:02:55 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Imagen Digital]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[redimensionar]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=438</guid>
		<description><![CDATA[Ver también Guía básica para editar imágenes en php con GD Esta es una técnica para redimensionar imágenes a un tamaño fijo (aunque no guarde proporción), sin distorsionar la imágen. No, no se trata del escalado líquido. Esa técnica es demasiado compleja. Se trata de recortar la imágen para adaptarla a la nueva resolución, perdiendo [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Ver también <a href="http://boozox.net/php/guia-basica-para-editar-imagenes-en-php-con-gd/">Guía básica para editar imágenes en php con GD</a></strong></em></p>
<p>Esta es una técnica para <strong>redimensionar imágenes a un tamaño fijo</strong> (aunque no guarde proporción), <strong>sin distorsionar la imágen</strong>.</p>
<p>No, no se trata del <a href="http://boozox.net/software-libre/escalado-liquido-para-gimp-22-ya-disponible-como-plugin/">escalado líquido</a>. Esa técnica es demasiado compleja. Se trata de <strong>recortar la imágen</strong> para adaptarla a la nueva resolución, perdiendo el <strong>mínimo espacio posible</strong>.</p>
<p><img src="http://boozox.net/wp-content/resizefit.png" alt="" title="resizefit"/></p>
<p style="text-align:center"><em>Foto de <a href="http://www.flickr.com/photos/basajaun/">Basajaun</a> en Flickr</em> <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/">Licencia CC(by-nc-sa)</a></p>
<p>Para hacer esto, he desarrollado este <strong>algoritmo</strong>, que paso a compartir con todos para que lo uséis como os de la gana (requiere <a href="http://es2.php.net/manual/es/book.image.php">Biblioteca GD</a>)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> resizeFit<span class="br0">&#40;</span><span class="re0">$im</span>,<span class="re0">$width</span>,<span class="re0">$height</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//Original sizes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$ow</span> = imagesx<span class="br0">&#40;</span><span class="re0">$im</span><span class="br0">&#41;</span>; <span class="re0">$oh</span> = imagesy<span class="br0">&#40;</span><span class="re0">$im</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">//To fit the image in the new box by cropping data from the image, i have to check the biggest prop. in height and width</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$width</span>/<span class="re0">$ow</span> &gt; <span class="re0">$height</span>/<span class="re0">$oh</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$nw</span> = <span class="re0">$width</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$nh</span> = <span class="br0">&#40;</span><span class="re0">$oh</span> * <span class="re0">$nw</span><span class="br0">&#41;</span> / <span class="re0">$ow</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$px</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$py</span> = <span class="br0">&#40;</span><span class="re0">$height</span> &#8211; <span class="re0">$nh</span><span class="br0">&#41;</span> / <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$nh</span> = <span class="re0">$height</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$nw</span> = <span class="br0">&#40;</span><span class="re0">$ow</span> * <span class="re0">$nh</span><span class="br0">&#41;</span> / <span class="re0">$oh</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$py</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$px</span> = <span class="br0">&#40;</span><span class="re0">$width</span> &#8211; <span class="re0">$nw</span><span class="br0">&#41;</span> / <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//Create a new image width requested size</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$new</span> = imagecreatetruecolor<span class="br0">&#40;</span><span class="re0">$width</span>,<span class="re0">$height</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//Copy the image loosing the least space</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; imagecopyresampled<span class="br0">&#40;</span><span class="re0">$new</span>, <span class="re0">$im</span>, <span class="re0">$px</span>, <span class="re0">$py</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="re0">$nw</span>, <span class="re0">$nh</span>, <span class="re0">$ow</span>, <span class="re0">$oh</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$new</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>[<a href="http://boozox.net/jaula/resizefit.phps">Descargar código</a>]</p>
<h2>Cómo utilizar</h2>
<p>Si <strong>no estás familiarizado</strong> con la edición de imágenes en PHP, no te preocupes. Para utilizar la función de arriba, tenemos que pasarle como parámetro una imágen <strong>tipo resource de GD</strong> y <strong>dos números</strong> indicando el ancho y alto que queréis forzar a la foto.</p>
<p>Para que se vea, hay que editar las <strong>cabeceras HTTP</strong> indicando que el contenido es una imágen. Y a este archivo de imágen (aunque sea un PHP) se le puede llamar desde la <strong>etiqueta img</strong> de HTML. Dejemos que hable el código:</p>
<p><strong>imagen.php</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//Primero creo el resource de la imagen desde el original en JPEG</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$im</span> = imagecreatefromjpeg<span class="br0">&#40;</span><span class="st0">&#8216;original.jpg&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Ahora uso la función antes definida, con unos parámetros de ancho y alto que yo quiera</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$resized</span> = resizeFit<span class="br0">&#40;</span><span class="re0">$im</span>, <span class="nu0">100</span>, <span class="nu0">150</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Indico en la cabecera HTTP que es una imagen</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Content-type: image/png&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//Por último exporto la nueva imagen</span></div>
</li>
<li class="li1">
<div class="de1">imagepng<span class="br0">&#40;</span><span class="re0">$resized</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><strong>miPagina.html</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;p&gt;Esta es mi foto redimensionada a 100 x 150:&lt;/p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;img src=&quot;imagen.php&quot;&gt;</div>
</li>
</ol>
</div>
<h2>Puedes ver un ejemplo en &#8230;</h2>
<p>Esta técnica la uso en <a href="http://gpsia.com/">Gpsia</a> para mostrar las imágenes al tamaño que yo le diga, sin que se vean distorsionadas. Échale un ojo, y de paso ves las rutas tan increíbles que está subiendo la gente.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/redimensionar-en-php-a-tamano-fijo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>HTML del visor de Youtube a partir de su URL</title>
		<link>http://boozox.net/codigo/html-del-visor-de-youtube-a-partir-de-su-url/</link>
		<comments>http://boozox.net/codigo/html-del-visor-de-youtube-a-partir-de-su-url/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 12:25:02 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=446</guid>
		<description><![CDATA[Esta es una función que acabo de crear para transformar una URL de un vídeo de youtube en el código HTML del visor. Aúnque la URL sea de las enrevesadas, la función sigue interpretando correctamente. http://es.youtube.com/watch?v=V0w2D0Kxq3Q&#038;feature=PlayList&#038;p=0704B55480867B61&#038;index=3&#038;playnext=1&#038;playnext_from=PL La magia reside en la expresión regular que me he currado ^http://([^\.]{0,2}\.)?youtube.com/watch\?.*v=([^&#038;]+)&#038;?.*$ Podéis usarla para lo que os de [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una función que acabo de crear para <strong>transformar una URL de un vídeo de youtube en el código HTML del visor</strong>.</p>
<p>Aúnque la URL sea de las <em>enrevesadas</em>, la función sigue interpretando correctamente.</p>
<blockquote><p>http://es.youtube.com/watch?v=V0w2D0Kxq3Q&#038;feature=PlayList&#038;p=0704B55480867B61&#038;index=3&#038;playnext=1&#038;playnext_from=PL</p></blockquote>
<p>La magia reside en la <a href="http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/">expresión regular</a> que me he currado</p>
<blockquote><p>^http://([^\.]{0,2}\.)?youtube.com/watch\?.*v=([^&#038;]+)&#038;?.*$</p></blockquote>
<p>Podéis usarla para <strong>lo que os de la gana</strong>, la licencia es <a href="http://creativecommons.org/licenses/publicdomain/deed.es_AR">Dominio Público</a>.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> youtubeUrlToHTML<span class="br0">&#40;</span><span class="re0">$url</span>, <span class="re0">$width</span> = <span class="nu0">425</span>, <span class="re0">$height</span> = <span class="nu0">344</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!<a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&quot;^http://(www.)?([^<span class="es0">\.</span>]{0,2}<span class="es0">\.</span>)?youtube.com/watch<span class="es0">\?</span>.*v=([^&amp;]+)&amp;?.*$&quot;</span>,<span class="re0">$url</span>,<span class="re0">$regs</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$key</span> = <span class="re0">$regs</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;&lt;object width=&quot;&#8217;</span>.<span class="re0">$width</span>.<span class="st0">&#8216;&quot; height=&quot;&#8217;</span>.<span class="re0">$height</span>.<span class="st0">&#8216;&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/&#8217;</span>.<span class="re0">$key</span>.<span class="st0">&#8216;&amp;hl=es&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/&#8217;</span>.<span class="re0">$key</span>.<span class="st0">&#8216;&amp;hl=es&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;&#8217;</span>.<span class="re0">$width</span>.<span class="st0">&#8216;&quot; height=&quot;&#8217;</span>.<span class="re0">$height</span>.<span class="st0">&#8216;&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>[<strong><a href="http://boozox.net/jaula/youtubelink.php">Demo</a></strong>] [<strong><a href="http://boozox.net/jaula/youtubelink.phps">Código</a></strong>]</p>
<p>Y si crees que la puedes <strong>mejorar</strong>&#8230; a que no me dices eso en la calle!! </p>
<p>Mejor dilo en los <strong>comentarios</strong></p>
<p><strong>Aportación de Javier:</strong><br />
<a href="http://boozox.net/codigo/html-del-visor-de-youtube-a-partir-de-su-url/#comment-2031">Javier</a> propone una forma de hacer lo mismo sin utilizar expresiones regulares, haciendo uso de <a href="http://es.php.net/manual/es/function.parse-url.php">parse_url</a> y <a href="http://es.php.net/manual/es/function.parse-str.php">parse_str</a>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> youtubeUrlToHTML<span class="br0">&#40;</span><span class="re0">$url</span>, <span class="re0">$width</span> = <span class="nu0">425</span>, <span class="re0">$height</span> = <span class="nu0">344</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/parse_str"><span class="kw3">parse_str</span></a><span class="br0">&#40;</span> <a href="http://www.php.net/parse_url"><span class="kw3">parse_url</span></a><span class="br0">&#40;</span> <span class="re0">$url</span>, PHP_URL_QUERY <span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$key</span> = !<a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span> <span class="re0">$v</span> <span class="br0">&#41;</span> ? <span class="re0">$v</span> : <span class="re0">$url</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;&lt;object width=&quot;&#8217;</span>.<span class="re0">$width</span>.<span class="st0">&#8216;&quot; height=&quot;&#8217;</span>.<span class="re0">$height</span>.<span class="st0">&#8216;&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/&#8217;</span>.<span class="re0">$key</span>.<span class="st0">&#8216;&amp;hl=es&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/&#8217;</span>.<span class="re0">$key</span>.<span class="st0">&#8216;&amp;hl=es&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;&#8217;</span>.<span class="re0">$width</span>.<span class="st0">&#8216;&quot; height=&quot;&#8217;</span>.<span class="re0">$height</span>.<span class="st0">&#8216;&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Muchas gracias por tu aportación!</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/codigo/html-del-visor-de-youtube-a-partir-de-su-url/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>MySQL &#8211; Seleccionar al azar, o lista desordenada</title>
		<link>http://boozox.net/mysql/mysql-seleccionar-al-azar-o-una-lista-desordenada/</link>
		<comments>http://boozox.net/mysql/mysql-seleccionar-al-azar-o-una-lista-desordenada/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 23:15:17 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=380</guid>
		<description><![CDATA[Tan sencillo como usar la función RAND() de MySQL. La clave está en ordenar los elementos seleccionados por un parámetro aleatorio. Un ejemplo sería esta sentencia: SELECT * FROM mi_tabla WHERE a &#62; 10 AND b &#60; 200 ORDER BY RAND&#40;&#41; Esto nos daría los resultados que queremos, ordenados aleatoriamente. Si queremos coger un sólo [...]]]></description>
			<content:encoded><![CDATA[<p>Tan sencillo como usar la función <strong><a href="http://mysql.conclase.net/curso/index.php?fun=RAND">RAND()</a></strong> de MySQL.</p>
<p>La clave está en <strong>ordenar los elementos</strong> seleccionados por un parámetro <strong>aleatorio</strong>. Un ejemplo sería esta sentencia:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> mi_tabla <span class="kw1">WHERE</span> a &gt; <span class="nu0">10</span> <span class="kw1">AND</span> b &lt; <span class="nu0">200</span> <span class="kw1">ORDER</span> <span class="kw1">BY</span> RAND<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Esto nos daría los resultados que queremos, ordenados <strong>aleatoriamente</strong>.</p>
<p>Si queremos coger <strong>un sólo registro al azar</strong>, no tenemos más que limitar el anterior Select a un registro.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> mi_tabla <span class="kw1">WHERE</span> a &gt; <span class="nu0">10</span> <span class="kw1">AND</span> b &lt; <span class="nu0">200</span> <span class="kw1">ORDER</span> <span class="kw1">BY</span> RAND<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">LIMIT</span> <span class="nu0">1</span></div>
</li>
</ol>
</div>
<p>Como diría <a href="http://tentacul.us/track/2294/">Janet Jackson</a>, I want FeedBack!!</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/mysql/mysql-seleccionar-al-azar-o-una-lista-desordenada/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Parsear un archivo XML con PHP y DOM.XML</title>
		<link>http://boozox.net/php/parsear-un-archivo-xml-con-php-y-domxml/</link>
		<comments>http://boozox.net/php/parsear-un-archivo-xml-con-php-y-domxml/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 01:17:26 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=376</guid>
		<description><![CDATA[Brevemente voy a introducir el uso de la extensión DOM.XML de PHP Podemos leer un archivo XML a partir de una cadena de texto (con domxml_open_mem) o diciendo dónde está el archivo XML ( con domxml_open_file) Como ejemplo usaremos el archivo XML que proporciona el API Google Weather (no documentada) para hacer predicciones meteorológicas en [...]]]></description>
			<content:encoded><![CDATA[<p>Brevemente voy a introducir el uso de la <strong><a href="http://es.php.net/manual/en/book.domxml.php">extensión DOM.XML</a></strong> de PHP</p>
<p>Podemos leer un archivo XML a partir de una cadena de texto (con <a href="http://es.php.net/manual/es/function.domxml-open-mem.php">domxml_open_mem</a>) o diciendo dónde está el archivo XML ( <a href="http://es.php.net/manual/es/function.domxml-open-file.php">con domxml_open_file</a>)</p>
<p style="text-align:center"><img src="http://boozox.net/wp-content/tags_tree.png"/></p>
<p>Como ejemplo usaremos el archivo XML que proporciona el <strong>API Google Weather</strong> <em>(no documentada)</em> para hacer predicciones meteorológicas en determinado lugar.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$xml</span> = domxml_open_file<span class="br0">&#40;</span><span class="st0">&#8216;http://www.google.com/ig/api?hl=es&amp;weather=Madrid&#8217;</span><span class="br0">&#41;</span>; <span class="co1">//En este caso la prediccion para madrid</span></div>
</li>
</ol>
</div>
<p>El <em>método</em> más importante es <strong><a href="http://es.php.net/manual/es/function.domdocument-get-elements-by-tagname.php">get_elements_by_tagname</a></strong>, que nos devuelve <strong>los tags que tienen ese nombre</strong>, en forma de array.</p>
<p>En nuestro caso, vamos a hacer una comprobación por si el documento XML nos informa de que ha habido un error, con el tag <strong>problem_cause</strong> <a href="http://www.google.com/ig/api?hl=es&#038;weather=noexiste">ver ejemplo</a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$problem</span> = <span class="re0">$xml</span>-&gt;<span class="me1">get_elements_by_tagname</span><span class="br0">&#40;</span><span class="st0">&#8216;problem_cause&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$problem</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$problem_cause</span> = <span class="re0">$problem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>-&gt;<span class="me1">get_attribute_node</span><span class="br0">&#40;</span><span class="st0">&#8216;data&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="re0">$problem_cause</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Para obtener la descripción, tendremos que usar el método <strong><a href="http://es.php.net/manual/es/function.domelement-get-attribute-node.php">get_attribute_node</a></strong> que nos dice <strong>el valor del atributo</strong> que queramos, para un elemento [nombreTag <strong>atributo</strong>="valor"].</p>
<p>Y ahora, vamos a ir directos <strong>al ajo</strong>. Echad un vistazo a la <a href="http://www.google.com/ig/api?hl=es&#038;weather=Valencia,Espa%C3%B1a">estructura del API Google Weather</a>, y al <strong>siguiente código</strong>, después lo explico.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//Esta funcion nos ayuda a sacar el atributo &quot;data&quot; del &quot;tag&quot; de un nodo dado</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getTagDataFromNode<span class="br0">&#40;</span><span class="re0">$tag</span>,<span class="re0">$node</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$child</span> = <span class="re0">$node</span>-&gt;<span class="me1">get_elements_by_tagname</span><span class="br0">&#40;</span><span class="re0">$tag</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span> = <span class="re0">$child</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>-&gt;<span class="me1">get_attribute_node</span><span class="br0">&#40;</span><span class="st0">&#8216;data&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$data</span>-&gt;<span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Extraigo la informacion de la prediccion</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$infoTag</span> = <span class="re0">$xml</span>-&gt;<span class="me1">get_elements_by_tagname</span><span class="br0">&#40;</span><span class="st0">&#8216;forecast_information&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$city</span> = getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;city&#8217;</span>,<span class="re0">$infoTag</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="co1">//La ciudad</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$date</span> = getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;forecast_date&#8217;</span>,<span class="re0">$infoTag</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="co1">//La fecha de la prediccion</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;&lt;h1&gt;Prediccion en $city ($date)&lt;/h1&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//Prediccion para los proximos dias</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$items</span> = <span class="re0">$xml</span>-&gt;<span class="me1">get_elements_by_tagname</span><span class="br0">&#40;</span><span class="st0">&#8216;forecast_conditions&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$items</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;&lt;p&gt;&lt;strong&gt;&quot;</span>.getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;day_of_week&#8217;</span>,<span class="re0">$item</span><span class="br0">&#41;</span>.<span class="st0">&quot;&lt;/strong&gt; &lt;br&gt;&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;&lt;img src=<span class="es0">\&quot;</span>http://google.com&quot;</span>.getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;icon&#8217;</span>,<span class="re0">$item</span><span class="br0">&#41;</span>.<span class="st0">&quot;<span class="es0">\&quot;</span>&gt;&lt;br&gt;&quot;</span>.getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;condition&#8217;</span>,<span class="re0">$item</span><span class="br0">&#41;</span>.<span class="st0">&quot;.&lt;br&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Temperaturas entre &quot;</span>.getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;low&#8217;</span>,<span class="re0">$item</span><span class="br0">&#41;</span>.<span class="st0">&quot; &amp;deg;C y &quot;</span>.getTagDataFromNode<span class="br0">&#40;</span><span class="st0">&#8216;high&#8217;</span>,<span class="re0">$item</span><span class="br0">&#41;</span>.<span class="st0">&quot; &amp;deg;C&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>[<a href="http://boozox.net/jaula/weather.php">Ver resultado</a>]</p>
<p>La función que se define al comienzo sirve para ahorrarnos código al extraer el atributo &#8220;data&#8221; de los nodos, porque todos los tags tienen lo importante ahí.</p>
<p>El resto del código creo que está bastante claro. Puedes ver una [<strong><a href="http://boozox.net/jaula/weather.php">Demo</a></strong>] y el [<strong><a href="http://boozox.net/jaula/weather.phps">código fuente</a></strong>].</p>
<h2>Si te ha gustado el post, te parece interesante, o tienes dudas escríbeme un comentario, tengo ganas de leerte!</h2>
<p><strong>Nota:</strong> Si no tienes esta extensión instalada en tu host, pregunta al servicio técnico para que te lo instalen, o mira <a href="http://es.php.net/manual/en/domxml.installation.php">esta página</a> para hacerlo tú mismo.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/parsear-un-archivo-xml-con-php-y-domxml/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Geolocalizar usuarios con su IP</title>
		<link>http://boozox.net/php/geolocalizar-usuarios-con-su-ip/</link>
		<comments>http://boozox.net/php/geolocalizar-usuarios-con-su-ip/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 08:35:33 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[geolocalizacion]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[localizacion]]></category>
		<category><![CDATA[programa]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://boozox.net/?p=214</guid>
		<description><![CDATA[Os quiero comentar brevemente cómo saber el País del que provienen vuestros visitantes, usando su IP, y la base de datos de MaxMind Para tener esta feature, descargamos la última versión de GeoLite Country (es la versión gratuita de la base de datos). Esto es un archivo comprimido, que contiene un archivo tipo DAT. Lo [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://boozox.net/wp-content/estoy-aqui.jpg' alt='estoy-aqui' / style="float:right">Os quiero comentar brevemente <strong>cómo saber el País del que provienen vuestros visitantes</strong>, usando <strong>su IP</strong>, y la base de datos de <a href="http://www.maxmind.com/">MaxMind</a></p>
<p>Para tener esta feature, descargamos la <strong>última versión</strong> de <strong><a href="http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz">GeoLite Country</a> </strong>(es la versión gratuita de la base de datos).</p>
<p>Esto es un archivo comprimido, que contiene un archivo tipo DAT. Lo <strong>descomprimimos</strong> en nuestro directorio, y nos olvidamos de él.</p>
<p>Si vais a programar en PHP aquí hay algunos <a href="http://www.maxmind.com/download/geoip/api/php/">archivos de muestra</a>. También hay soporte para <a href="http://www.maxmind.com/app/api">otros lenguajes</a>.</p>
<p>El que más nos importa es el archivo <strong><a href="http://www.maxmind.com/download/geoip/api/php/geoip.inc">geoip.inc</a></strong>  que contiene la librería para <strong>gestionar la base de datos en PHP</strong>. <strong>Guardamos</strong> el archivo en el mismo directorio que la base de datos.</p>
<p><strong>Ahora, sólo nos queda un poco de código:</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Este codigo muestra como usar la API de GeoIP</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;geoip.inc&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$gi</span> = geoip_open<span class="br0">&#40;</span><span class="st0">&quot;GeoIP.dat&quot;</span>,GEOIP_STANDARD<span class="br0">&#41;</span>; </div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$cc</span> = geoip_country_code_by_addr<span class="br0">&#40;</span><span class="re0">$gi</span>, <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#8216;REMOTE_ADDR&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">geoip_close<span class="br0">&#40;</span><span class="re0">$gi</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;El codigo de tu pais es: $cc&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p><em><a href="http://boozox.net/jaula/geoip_cod.php">Ver ejemplo</a></em></p>
<p>Esto mostrará por pantalla algo como</p>
<blockquote><p>El codigo de tu pais es: ES</p></blockquote>
<p>Si queremos usar el nombre del país en Español, podéis descargaros <a href="http://boozox.net/jaula/paises.inc">este archivo</a> que he preparado. Contiene un array asociativo con las claves de los paises, y sus valores, usadlo así:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Este codigo muestra como usar la API de GeoIP</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;geoip.inc&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;paises.inc&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$gi</span> = geoip_open<span class="br0">&#40;</span><span class="st0">&quot;GeoIP.dat&quot;</span>,GEOIP_STANDARD<span class="br0">&#41;</span>; </div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$cc</span> = geoip_country_code_by_addr<span class="br0">&#40;</span><span class="re0">$gi</span>, <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#8216;REMOTE_ADDR&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">geoip_close<span class="br0">&#40;</span><span class="re0">$gi</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Tu vienes de &quot;</span>.<a href="http://www.php.net/utf8_decode"><span class="kw3">utf8_decode</span></a><span class="br0">&#40;</span><span class="re0">$PAISES</span><span class="br0">&#91;</span><span class="re0">$cc</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p><em><a href="http://boozox.net/jaula/geoip_nom.php">Ver ejemplo</a></em></p>
<p>Debería aparecer algo similar a:</p>
<blockquote><p>Tu vienes de España</p></blockquote>
<p><strong>Nota1</strong>: Recomiendo tener todos los archivos en el mismo directorio, si no lo hacéis así, tened cuidado con poner bien la ruta a cada archivo!</p>
<p><strong>Nota2</strong>: Si algún código que has copiado de esta web no te funciona, comprueba que las comillas sean correctas (reescríbelas con tu teclado) WordPress traduce las comillas simples y dobles que se usan en código, por otras raras que se usan en textos.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/geolocalizar-usuarios-con-su-ip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejecuta código C, Perl, Python&#8230; via web</title>
		<link>http://boozox.net/aplicaciones/ejecuta-codigo-c-perl-python-via-web/</link>
		<comments>http://boozox.net/aplicaciones/ejecuta-codigo-c-perl-python-via-web/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 11:08:19 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Código]]></category>

		<guid isPermaLink="false">http://boozox.net/aplicaciones/ejecuta-codigo-c-perl-python-via-web/</guid>
		<description><![CDATA[Una vez más se demuestra mi teoría de que TODO puede hacerse via web, sólo se necesitan programadores dispuestos a crear el servicio. Esta vez es el caso de un compilador/intérprete de lenguajes via web. Se llama CodePad, y admite lenguajes tan conocidos como C, C++, D, Perl, Python, Ruby y algunos más. He hecho [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://boozox.net/wp-content/code.jpg" alt="code.jpg2" style="float:right"/> Una vez más se demuestra mi teoría de que <strong>TODO puede hacerse via web</strong>, sólo se necesitan programadores dispuestos a crear el servicio.</p>
<p>Esta vez es el caso de un compilador/intérprete de lenguajes via web. Se llama <a href="http://codepad.org/">CodePad</a>, y admite lenguajes tan conocidos como <strong>C, C++, D, Perl, Python, Ruby</strong> <em>y algunos más</em>.</p>
<p>He hecho unas cuantas pruebas con código C rebuscado y efectivamente compila y ejecuta de forma correcta, incluso <strong>te explica los errores de código</strong> si los hay.</p>
<p>Una idea similar tube hace algún tiempo, pero no fructificó el proyecto, ahora me quito el sombrero ante lo que ha hecho <strong><a href="http://www.hackerdashery.com/">Steven Hazel</a></strong> (el desarrollador). Parece ser que ha sido desarrollado en <strong>Python</strong>, y que ha puesto énfasis en la <strong>seguridad</strong>. Aún así insta a <em>hackers</em> que comuniquen sus éxitos.</p>
<p>A partir del buen servicio que ha conseguido CodePad, se podría explotar ahí una <strong>comunidad de desarrolladores</strong> muy guapa, o crear toda una plataforma web para programadores, para que cuelguen sus proyectos de Software Libre, los promocionen, interactúen, y tengan a mano <strong>herramientas</strong> tan interesantes como el compilador, o un editor de código que esté bien. Sería una idea nada despreciable.</p>
<p>via <a href="http://wwwhatsnew.com/2008/04/13/codepad-prueba-tu-codigo-online/">wwWhat&#8217;s New</a></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/aplicaciones/ejecuta-codigo-c-perl-python-via-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apoyemos al PHP!</title>
		<link>http://boozox.net/php/apoyemos-al-php/</link>
		<comments>http://boozox.net/php/apoyemos-al-php/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 16:10:08 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/php/apoyemos-al-php/</guid>
		<description><![CDATA[A raíz del post anterior haciendo mimetismos entre lenguajes de programación y embarcaciones, nos encontramos con que al lenguaje de programación PHP se le asignaba una triste balsa de bambú. PHP is a bamboo raft. A series of hacks held together by string. Still keeps afloat though. PHP es una balsa de bambú. Unos cuantos [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz del post anterior haciendo mimetismos entre <strong>lenguajes de programación y embarcaciones</strong>, nos encontramos con que al lenguaje de programación PHP se le asignaba <strong>una triste balsa de bambú</strong>.</p>
<blockquote><p>PHP is a bamboo raft. A series of hacks held together by string. Still keeps afloat though.</p>
<p><em>PHP es una balsa de bambú. Unos cuantos apaños unidos con una cuerda. Aún así consigue ir a flote</em></p></blockquote>
<p>Me parece un juicio muy injusto, y a los comentaristas de Boozox también!</p>
<ul>
<li><strong><a href="http://memiux.com/">Memiux</a></strong>: [...] un poco exagerado lo de PHP xD</li>
<li><strong>daniel</strong>: El que diga eso de php, es que no tiene ni idea [...]</li>
<li><strong><a href="http://www.humorizate.com/">Jose D</a></strong>: [...] yo también defiendo a php que está que se sale por todos lados [...]</li>
</ul>
<p>Coincido con todos ellos, PHP no es una triste balsa da bambú! PHP <strong>es un lenguaje muy potente</strong> sobretodo para lo que está enfocado (<em>desarrollo de webs dinámicas</em>). Cuenta con infinidad de funciones y bibliotecas útiles para cualquier cosa que se te pase por la mente, y de hecho un porcentaje muy elevado (la mayor parte) de las webs en internet <a href="http://www.php.net/usage.php">están respaldadas</a> por este lenguaje.</p>
<p>No en vano, webs como <a href="http://www.elpais.com/articulo/portada/Suraski/coautor/PHP/Youtube/Yahoo/usan/lenguaje/web/elpeputeccib/20070426elpcibpor_2/Tes">Youtube, yahoo</a>, <a href="http://www.taringa.net/posts/info/1079554/Queres-saber-que-web-usa-PHP-para-su-sitio-.html">wikipedia, facebook, digg, flickr&#8230;.</a> han elejido como lenguaje idóneo el PHP.</p>
<p>Se le acusa de provocar <a href="http://es.wikipedia.org/wiki/Php#Desventajas">desorden en el código</a> y en la estructura de los programas, pero esto es un hecho que se desprende de la <em>habilidad y la experiencia</em> de quien programa.</p>
<p>Es posible que el hecho de que la <em>versatilidad y facilidad</em> de PHP permita su uso a <strong>personas inexpertas</strong>, de como resultado la proliferación de <em>código de mala calidad</em>, pero no se puede generalizar, y declarar que en PHP se programan apaños y chapuzas.</p>
<p>He programado toda mi vida en PHP y jamás me ha presentado una frontera, <strong>el límite ha sido siempre mi imaginación</strong>. </p>
<p>Por ello quiero defender el papel de PHP, y promover su uso para cualquier tipo de tarea en internet.</p>
<p><strong style="font-size: 2em;"><br />
Larga vida a PHP !!!!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/apoyemos-al-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Se llama Geo y es Libre</title>
		<link>http://boozox.net/software-libre/se-llama-geo-y-es-libre/</link>
		<comments>http://boozox.net/software-libre/se-llama-geo-y-es-libre/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 00:56:45 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Novedades]]></category>
		<category><![CDATA[Software libre]]></category>

		<guid isPermaLink="false">http://boozox.net/software-libre/se-llama-geo-y-es-libre/</guid>
		<description><![CDATA[De acuerdo, voy a comentaros qué me ha tenido todo este tiempo tan ausente. He dedicado la mayor parte de mi tiempo a desarrollar la primera versión de la aplicación Geo. Geo es una aplicación web para compartir rutas captadas con GPS. Detrás de Geo hay toda una infraestructura de objetos y algoritmos que me [...]]]></description>
			<content:encoded><![CDATA[<p>De acuerdo, voy a comentaros qué me ha tenido todo este tiempo tan ausente.</p>
<p>He dedicado la mayor parte de mi tiempo a desarrollar la <strong>primera versión de la <a href="http://geogps.es/">aplicación Geo</a></strong>. Geo es una aplicación web para <strong>compartir rutas captadas con GPS</strong>.</p>
<p>Detrás de Geo hay toda una infraestructura de objetos y algoritmos que me ha costado mucho de elaborar (los últimos tres meses), pero puedo decir que <strong>estoy muy orgulloso del resultado</strong>, y es una base genial para continuar haciendo de Geo una herramiente potente de aquí en adelante.</p>
<p>Como es lógico he liberado Geo (en realidad se llama GeoGPS) con la licencia GNU/GPL, pero esta vez he querido llegar más lejos, y lo he enviado como proyecto a <a href="http://sourceforge.net/projects/geogps/">Sourceforge</a>, donde tendrá todas las atenciones que un buen proyecto libre merece.</p>
<p>Por ahora podéis leer (y agregaros al RSS) <strong><a href="http://blog.geogps.es/">el blog</a></strong> que he creado y actualizo para este proyecto, y <a href="http://geogps.es/">navegar</a> entre las casi 100 rutas con las que ya cuenta la web de Geo.</p>
<p>Me disculpo por la escasa actualización de este blog. Entre la universidad y proyectos como Geo, no me queda apenas tiempo&#8230; <img src='http://boozox.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Un saludo a todos!</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/software-libre/se-llama-geo-y-es-libre/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hacer que una web no se vea en Internet Explorer</title>
		<link>http://boozox.net/html/hacer-que-una-web-no-se-vea-en-internet-explorer/</link>
		<comments>http://boozox.net/html/hacer-que-una-web-no-se-vea-en-internet-explorer/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 23:28:56 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Bug]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Curioso]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://boozox.net/html/hacer-que-una-web-no-se-vea-en-internet-explorer/</guid>
		<description><![CDATA[Programando una web, me he topado con esta curiosidad. El código es el siguiente: &#160; &#60;head&#62; &#60;title&#62;Titulo de la pagina&#60;title&#62; &#60;/head&#62; &#160; Nótese que la etiqueta TITLE no se cierra correctamente. Di con esto por accidente, pero me resultó curioso que navegadores como Firefox o Safari visualizaran correctamente la página, mientras que Internet Explorer símplemente [...]]]></description>
			<content:encoded><![CDATA[<p>Programando una web, me he topado con esta curiosidad.</p>
<p>El código es el siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;head&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;title&gt;Titulo de la pagina&lt;title&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/head&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p><img src='http://boozox.net/wp-content/ie7.jpg' alt='ie7.jpg' style="float:right;"/>Nótese que la etiqueta TITLE no se cierra correctamente.</p>
<p>Di con esto por accidente, pero me resultó curioso que navegadores como Firefox o Safari visualizaran correctamente la página, mientras que Internet Explorer símplemente mostraba una pantalla en blanco.</p>
<p>Una nueva técnica para fanáticos anti IE (qué desarrollador no lo es&#8230;)? </p>
<p>En cualquier caso es una falta intencionada de sintaxis, que por mucho odio que tengamos a este navegador, no deberíamos cometer.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/html/hacer-que-una-web-no-se-vea-en-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

