<?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; PHP</title>
	<atom:link href="http://boozox.net/category/php/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>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>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>Desenfoque gaussiano: cómo funciona + filtro para Imaset</title>
		<link>http://boozox.net/php/desenfoque-gaussiano-como-funciona-filtro-para-imaset/</link>
		<comments>http://boozox.net/php/desenfoque-gaussiano-como-funciona-filtro-para-imaset/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 22:18:08 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Imagen Digital]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://boozox.net/php/desenfoque-gaussiano-como-funciona-filtro-para-imaset/</guid>
		<description><![CDATA[Me he propuesto realizar el filtro de Desenfoque Gaussiano, y lo he conseguido. A continuación os muestro el algoritmo, y la descarga del filtro para quienes usen Imaset 2.1 El algoritmo El filtro gaussiano consiste en la mezcla de los colores de una imágen para conseguir un efecto de desenfoque. Esta es una explicación muy [...]]]></description>
			<content:encoded><![CDATA[<p>Me he propuesto realizar el filtro de Desenfoque Gaussiano, y lo he conseguido. A continuación os muestro el algoritmo, y la descarga del filtro para quienes usen <a href="http://boozox.net/software-libre/imaset-21-liberado/">Imaset 2.1</a></p>
<h2>El algoritmo</h2>
<p>El filtro gaussiano consiste en la <strong>mezcla de los colores</strong> de una imágen para conseguir un efecto de <strong>desenfoque</strong>. Esta es una explicación muy general, y por supuesto el algoritmo es más complejo que esto.</p>
<p>En primer lugar, consideraremos la imágen como una <strong>matriz de puntos</strong> (pixeles), con unos valores determinados de <strong>rojo, verde y azul</strong>. A partir de aquí, los valores de cada punto de <em>la nueva imágen</em>, serán una combinación de los puntos cercanos. De esta forma, si un punto es de color rojo, y cercano a él hay puntos negros, este rojo se oscurecerá (y los negros se enrojecerán).</p>
<div style="text-align:center"><img src='http://boozox.net/wp-content/intercambio_pixels1.jpg' alt='Intercambio de color entre pixeles cercanos' /></div>
<p>Pero para determinar cuáles son los pixeles que son cercanos, y los que no, se debe especificar al filtro un radio de acción. Con esto, si por ejemplo indicamos un radio de 10 pixeles, cada píxel de la nueva imágen se verá modificado por los todos los pixeles a menos de 10 unidades de distancia. Pero no todos los pixeles modifican con la misma &#8220;fuerza&#8221;, cuanto más cerca estén del pixel que se está modificando, más valor tendrán en el cálculo del nuevo color. Es aquí donde aparece nuestro simpático amigo <a href="http://es.wikipedia.org/wiki/Carl_Friedrich_Gauss">Gauss</a>.</p>
<p>La función de la <a href="http://es.wikipedia.org/wiki/Funci%C3%B3n_gaussiana">distribución Gaussiana</a> va a ayudarnos a adjudicar cuánto aporta cada pixel, en función de lo cerca o lejos que se encuentre. Esta función tiene la forma <img src='http://boozox.net/wp-content/distribucion_gaussiana.png' alt='distribucion_gaussiana.png' /> donde <em>(x-b)</em> es la distancia entre el pixel que está siendo modificado y el píxel del que se está tomando el valor, <em>a</em> y <em>c</em> valen 1, y f(x) resulta un número Real entre 0 y 1 que representa el porcentaje de influencia.</p>
<h2>Resumiendo</h2>
<p>Lo que está claro es que hay que mezclar los píxeles entre sí, y que usaremos un radio de influencia en que cuanto más lejos está un píxel de otro, menos le afecta.</p>
<p>Después de analizar el problema, y aplicar una fórmula estadística, podemos concluir que el <strong>valor de cada pixel</strong> es: </p>
<blockquote><p>La suma de todos los píxeles dentro del radio R, multiplicados cada uno por <img src='http://boozox.net/wp-content/distribucion_gaussiana.png' alt='distribucion_gaussiana.png' /> (tal y como se ha descrito antes), y todo esto, dividido entre la suma de todos los valores de la fórmula <img src='http://boozox.net/wp-content/distribucion_gaussiana.png' alt='distribucion_gaussiana.png' /> en los puntos que intervienen.</p></blockquote>
<p>Y todo eso es sólo para calcular uno de los tres componentes (Rojo, Verde o Azul) de <strong>un sólo pixel</strong>.</p>
<p>De modo que, a falta de una <em>fórmula mágica</em> de optimización, el efecto de desenfoque Gaussiano no es ninguna broma, realiza una <strong>cantidad muy elevada de cálculos</strong> (que aumenta junto al Radio y al tamaño de la imágen).</p>
<h2>El archivo de descarga</h2>
<p>Aquí os dejo el <strong>código fuente</strong> y la <strong><a href="http://boozox.net/jaula/gaussian.zip">descarga</a></strong> del filtro Desenfoque Gaussiano para <a href="http://codis.boozox.net/proyecto/Imaset">Imaset 2.1</a><br />
Tened en cuenta que, como he dicho, es un filtro muy costoso, y aplicarlo puede llevar bastantes segundos.</p>
<p>La forma de poder usarlo es: descargar el archivo ZIP, descomprimir su contenido, y subir el archivo <em>gaussian.xml</em> al directorio &#8220;<em>/filters</em>&#8221; y el archivo<em> es_ES.php</em> al directorio &#8220;<em>/lang</em>&#8221;</p>
<h2>Ejemplo del filtro Gaussiano en Imaset</h2>
<p><img src='http://boozox.net/wp-content/carl_friedrich_gauss_2.jpg' alt='Gauss' /><img src='http://boozox.net/wp-content/carl_friedrich_gauss.jpg' alt='Gauss Desenfocado' /><br />
Como se puede apreciar, realiza un toque de suavizado, si se aplica poco desenfoque (poco radio).</p>
<h2>Código fuente</h2>
<p>Os dejo como siempre el código fuente de este filtro. </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;filter&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;name&gt;gaussian_blur&lt;/name&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;category&gt;effect&lt;/category&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;parameters&gt;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;pa&gt;<span class="re0">$rad</span>=<span class="nu0">5</span>&lt;/pa&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/parameters&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;function&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!<span class="re0">$rad</span><span class="br0">&#41;</span> <span class="re0">$rad</span> = <span class="nu0">5</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sx</span> = imagesx<span class="br0">&#40;</span><span class="re0">$im</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sy</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$x</span>=-<span class="re0">$rad</span>;<span class="re0">$x</span>&lt;<span class="re0">$sx</span>+<span class="re0">$dar</span>;<span class="re0">$x</span>++<span class="br0">&#41;</span> <span class="co1">// meto en una matriz los valores de colores</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$y</span>=-<span class="re0">$rad</span>;<span class="re0">$y</span>&lt;<span class="re0">$sy</span>+<span class="re0">$rad</span>;<span class="re0">$y</span>++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$x</span>&lt;<span class="nu0">0</span> || <span class="re0">$y</span>&lt;<span class="nu0">0</span> || <span class="re0">$x</span>&gt;<span class="re0">$sx</span> || <span class="re0">$y</span>&gt;<span class="re0">$sy</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$imatrix</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$y</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$imaset</span>-&gt;<span class="me1">Red</span>,<span class="re0">$imaset</span>-&gt;<span class="me1">Green</span>,<span class="re0">$imaset</span>-&gt;<span class="me1">Blue</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rgb</span> = ImageColorAt<span class="br0">&#40;</span><span class="re0">$im</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$r</span> = <span class="br0">&#40;</span><span class="re0">$rgb</span> &gt;&gt; <span class="nu0">16</span><span class="br0">&#41;</span> &amp; 0xFF;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$g</span> = <span class="br0">&#40;</span><span class="re0">$rgb</span> &gt;&gt; <span class="nu0">8</span><span class="br0">&#41;</span> &amp; 0xFF;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$b</span> = <span class="re0">$rgb</span> &amp; 0xFF;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$imatrix</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$y</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$r</span>,<span class="re0">$g</span>,<span class="re0">$b</span><span class="br0">&#41;</span>; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Ahora voy a poner valores (calculandolos previamente)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$x</span>=<span class="nu0">0</span>; <span class="re0">$x</span>&lt;<span class="re0">$sx</span>; <span class="re0">$x</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// recorro el array antes construido, pixel a pixel</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$y</span>=<span class="nu0">0</span>; <span class="re0">$y</span>&lt;<span class="re0">$sy</span>; <span class="re0">$y</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/unset"><span class="kw3">unset</span></a><span class="br0">&#40;</span><span class="re0">$su1R</span>,<span class="re0">$su1G</span>,<span class="re0">$su1B</span>,<span class="re0">$su2</span>,<span class="re0">$sue</span><span class="br0">&#41;</span>; <span class="co1">// inicializo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span>=<span class="re0">$x</span>-<span class="re0">$rad</span>; <span class="re0">$i</span>&lt;<span class="re0">$x</span>+<span class="re0">$rad</span>; <span class="re0">$i</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// circundantes en eje x</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$j</span>=<span class="re0">$y</span>-<span class="re0">$rad</span>; <span class="re0">$j</span>&lt;<span class="re0">$y</span>+<span class="re0">$rad</span>; <span class="re0">$j</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// circundantes en eje y</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sue</span> = <a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><a href="http://www.php.net/pow"><span class="kw3">pow</span></a><span class="br0">&#40;</span><span class="nu0">2.7</span>,-<span class="br0">&#40;</span><a href="http://www.php.net/pow"><span class="kw3">pow</span></a><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$i</span>-<span class="re0">$x</span><span class="br0">&#41;</span>,<span class="nu0">2</span><span class="br0">&#41;</span> + <a href="http://www.php.net/pow"><span class="kw3">pow</span></a><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$j</span>-<span class="re0">$y</span><span class="br0">&#41;</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>*<span class="nu0">100</span>,<span class="nu0">4</span><span class="br0">&#41;</span>; <span class="co1">//valor gaussiano de peso</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$su1R</span> += <span class="re0">$sue</span> * <span class="re0">$imatrix</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>; <span class="co1">//Sumando de rojos</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$su1G</span> += <span class="re0">$sue</span> * <span class="re0">$imatrix</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>; <span class="co1">//Sumando de verdes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$su1B</span> += <span class="re0">$sue</span> * <span class="re0">$imatrix</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>; <span class="co1">//Sumando de azules</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$su2</span> += <span class="re0">$sue</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imagesetpixel<span class="br0">&#40;</span><span class="re0">$im</span>,<span class="re0">$x</span>,<span class="re0">$y</span>,imagecolorallocate<span class="br0">&#40;</span><span class="re0">$im</span>,<a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><span class="re0">$su1R</span>/<span class="re0">$su2</span><span class="br0">&#41;</span>,<a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><span class="re0">$su1G</span>/<span class="re0">$su2</span><span class="br0">&#41;</span>,<a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span><span class="re0">$su1B</span>/<span class="re0">$su2</span><span class="br0">&#41;</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$im</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/function&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;/filter&gt;</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/desenfoque-gaussiano-como-funciona-filtro-para-imaset/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Solucionado problema del plugin Imaset 2.1</title>
		<link>http://boozox.net/php/solucionado-problema-del-plugin-imaset-21/</link>
		<comments>http://boozox.net/php/solucionado-problema-del-plugin-imaset-21/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 17:38:35 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Boozox]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://boozox.net/boozox/solucionado-problema-del-plugin-imaset-21/</guid>
		<description><![CDATA[Tienes problemas para que funcione Imaset? Hasta ahora algunas personas tenían problemas para que el plugin Imaset en la versión 2.1 les reconociera las imágenes. Ya he conseguido dar con el problema, y he cambiado el archivo de descarga para que sustituyáis los archivos en el plugin. El problema que ocasionaba esto es bastante complejo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="#comments" style="font-size:2em; margin:10px 0 30px;display:block;text-align:center;" onClick="alert('Comentalo para que te pueda ayudar personalmente :)');">Tienes problemas para que funcione Imaset?</a><br />
Hasta ahora algunas personas tenían problemas para que el <a href="http://codis.boozox.net/proyecto/Imaset">plugin Imaset</a> en la versión 2.1 les reconociera las imágenes.</p>
<p>Ya he conseguido dar con el problema, y he cambiado el archivo de descarga para que sustituyáis los archivos en el plugin.</p>
<p>El problema que ocasionaba esto es bastante complejo de explicar, pero está relacionado con la yuxtaposición de arrays. En el código de Imaset yo había optado por usar la función <a href="http://es2.php.net/manual/es/function.array-merge.php">array_merge()</a>, la cual une los arrays que le pases como parámetro, pero esta función no mantiene los índices numéricos, y para la aplicación era importante que los mantuviera. </p>
<p>La solución es usar el concatenador básico de arrays, es decir, el <a href="http://es2.php.net/manual/es/language.operators.array.php">operador suma</a>.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$a1</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">5</span>=&gt;<span class="st0">&quot;ABC&quot;</span>,<span class="nu0">12</span>=&gt;<span class="st0">&quot;DEF&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$a2</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">30</span>=&gt;<span class="st0">&quot;PPP&quot;</span>,<span class="nu0">50</span>=&gt;<span class="st0">&quot;UIO&quot;</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">$a3</span> = <span class="re0">$a1</span> + <span class="re0">$a2</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* &nbsp;Ahora $a3 es:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">a3[5] = &quot;ABC&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">a3[12] = &quot;DEF&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">a3[30] = &quot;PPP&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">a3[50] = &quot;UIO&quot; &nbsp;*/</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/solucionado-problema-del-plugin-imaset-21/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Manual completo y sencillo de Expresiones Regulares en PHP</title>
		<link>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/</link>
		<comments>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/#comments</comments>
		<pubDate>Tue, 04 Dec 2007 20:42:46 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/</guid>
		<description><![CDATA[Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un patrón de búsqueda. Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increíblemente el trabajo. PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg [...]]]></description>
			<content:encoded><![CDATA[<p>Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un <strong>patrón de búsqueda</strong>. Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increíblemente el trabajo.</p>
<p><img src='http://boozox.net/wp-content/regex.jpg' alt='Regex' style="float:right"/></p>
<p>PHP permite <strong>dos tipos principales de funciones</strong> para expresiones regulares: las de <a href="http://es.php.net/manual/es/ref.regex.php">tipo ereg</a> (<em>Expresiones regulares POSIX</em>) y las de <a href="http://es.php.net/manual/es/ref.pcre.php">tipo preg</a> (<em>Compatibles con Perl</em>). Son muy similares, aúnque las segundas llegan a ser algo más potentes.</p>
<blockquote><p>Una expresión regular, consiste en <strong>comparar un patrón frente a un texto</strong>, para comprobar si el texto contiene lo especificado en el patrón. </p></blockquote>
<p>Por poner un par de ejemplos:</p>
<p>Patrón: <strong>in</strong><br />
Coindicen:</p>
<ul>
<li><strong>in</strong>tensidad</li>
<li>c<strong>in</strong>ta</li>
<li><strong>in</strong>terior</li>
</ul>
<p>Patrón: <strong>[mp]adre</strong><br />
Coindicen:</p>
<ul>
<li>Mi <strong>madre</strong> se llama Luisa</li>
<li>Tu <strong>padre</strong> es jardinero</li>
</ul>
<p>A continuación voy a repasar la sintaxis básica de una expresión regular<br />
<span id="more-216"></span></p>
<h2>Sintaxis y metacaracteres</h2>
<h3>El punto</h3>
<p>El punto representa <strong>cualquier caracter</strong>. Escribiendo un punto en un patrón querrás decir que ahí hay un caracter, cualquiera. Desde la A a la Z (en minúscula y mayúscula), del 0 al 9, o algún otro símbolo.</p>
<p><strong>Ejemplos:</strong><br />
<em style="color:#0077BB">ca.a</em> coincide con <em style="color:darkgreen">ca<strong>n</strong>a</em>, <em style="color:darkgreen">ca<strong>m</strong>a</em>, <em style="color:darkgreen">ca<strong>s</strong>a</em>, <em style="color:darkgreen">ca<strong>j</strong>a</em>, etc&#8230;<br />
No coincide con <em style="color:red">ca<strong>st</strong>a</em> ni <em style="color:red">caa</em> </p>
<h3>Principio y fin de cadena</h3>
<p>Si queremos indicar al patrón qué es el principio de la cadena o qué es el final, debemos hacerlo con <strong>^ para inicio y $ para final</strong>.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">^olivas</em>&#8221; coincide con &#8220;<em style="color:darkgreen"><strong>olivas</strong> verdes</em>&#8220;, pero no con &#8220;<em style="color:red">quiero olivas</em>&#8221;</p>
<h3>Cuantificadores</h3>
<p>Para indicar que cierto elemento del patrón va a repetirse un <strong>número indeterminado de veces</strong>, usaremos + o * . Usando + queremos decir que el elemento anterior aparece una o más veces. Usando * queremos decir que el elemento anterior aparece cero o más veces.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">gafas+</em>&#8221; coincide con &#8220;<em style="color:darkgreen">gafa<strong>ssss</strong></em>&#8221; pero no con &#8220;<em style="color:red">gafa</em>&#8221;<br />
sin embargo<br />
&#8220;<em style="color:#0077BB">clo*aca</em>&#8221; coincide con &#8220;<em style="color:darkgreen">claca</em>&#8220;, &#8220;<em style="color:darkgreen">cloaca</em>&#8220;, &#8220;<em style="color:darkgreen">cloooooooaca</em>&#8220;, etc..</p>
<p>Si lo que queremos indicar al patrón es que un elemento <strong>puede que esté (una vez) o puede que no</strong>, lo haremos con el interrogante de la siguiente forma:<br />
&#8220;<em style="color:#0077BB">coches?</em>&#8221; coincide con <em style="color:darkgreen">&#8220;coche&#8221;</em> y con <em style="color:darkgreen">&#8220;coches&#8221;</em></p>
<p>Para definir la <strong>cantidad de veces que va a repetirse el elemento</strong>, tendremos que hacer uso de las llaves: { }, indicando en su interior el intervalo, o la cantidad exacta de veces que va a repetirse. </p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">abc{4}</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abcccc</em>&#8220;, pero no con &#8220;<em style="color:red">abc</em>&#8221; ni &#8220;<em style="color:red">abcc</em>&#8220;, etc&#8230;<br />
&#8220;<em style="color:#0077BB">abc{1,3}</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abc</em>&#8220;, &#8220;<em style="color:darkgreen">abcc</em>&#8220;, &#8220;<em style="color:darkgreen">abccc</em>&#8220;, pero no con &#8220;<em style="color:red">abcccc</em>&#8221;</p>
<p>Si un parámetro queda vacío, significa &#8220;un <strong>número indeterminado</strong>&#8220;. Por ejemplo: &#8220;<em>x{5,}</em>&#8221; significa que la x ha de repetirse 5 veces, o más.</p>
<h3>Rangos</h3>
<p>Los corchetes [] incluidos en un patrón permiten especificar el <strong>rango de caracteres</strong> válidos a comparar. Basta que exista <em>cualquiera de ellos</em> para que se de la condición. Dentro de ellos pondremos cualquier cantidad de caracteres, uno a continuación del otro; o un rango del abecedario o de los números enteros del 0 al 9.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">c[ao]sa</em>&#8221; coincide con &#8220;<em style="color:darkgreen">casa</em>&#8221; y con &#8220;<em style="color:darkgreen">cosa</em>&#8221;<br />
&#8220;<em style="color:#0077BB">[a-f]</em>&#8221; coincide con todos los caracteres alfabéticos de la &#8220;<em>a</em>&#8221; a la &#8220;<em>f</em>&#8221;<br />
&#8220;<em style="color:#0077BB">[0-9][2-6][ANR]</em>&#8221; coincide con &#8220;<em style="color:darkgreen">12A</em>&#8220;, &#8220;<em style="color:darkgreen">35N</em>&#8220;, &#8220;<em style="color:darkgreen">84R</em>&#8220;, etc..<br />
pero no con &#8220;<em>2<strong style="color:red">1</strong>A</em>&#8220;, ni &#8220;<em>33<strong style="color:red">L</strong></em>&#8220;, ni &#8220;<em style="color:red">3A</em>&#8220;, etc&#8230;</p>
<p>Dentro de los corchetes, hay que tener en cuenta que el símbolo ^ ya no significa inicio, sinó que es un negador, es decir: &#8220;[^a-Z]&#8221; coincidirá con cualquier texto que NO tenga ningún caracter alfabético (ni minúsculas ni mayúsculas), y &#8220;^@ &#8221; coincide con cualquier caracter excepto &#8220;@&#8221; y &#8220;<em>espacio</em>&#8221; </p>
<h3>Alternancia</h3>
<p>Para alternar entre varias opciones, usaremos el símbolo | (barra vertical, en los teclados suele ser &#8220;Alt Gr + 1&#8243;). Con este mecanismo haremos un disyuntor, que nos permitirá dar varias opciones. Si una de ellas coincide, el patrón será cierto.<br />
<strong><br />
Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">aleman(ia|es)</em>&#8221; coincide con &#8220;<em style="color:darkgreen">aleman<strong>ia</strong></em>&#8221; y con &#8220;<em style="color:darkgreen">aleman<strong>es</strong></em>&#8221;<br />
&#8220;<em style="color:#0077BB">(norte|sur|este|oeste)</em>&#8221; coincide con cualquiera de los puntos cardinales.</p>
<h3>Agrupadores</h3>
<p>Los paréntesis nos sirven para agrupar un subconjunto. Como hemos visto en el ejemplo anterior, nos es útil para definir la alternancia, pero agrupar un subpatrón nos permite trabajar con él como si fuera un único elemento.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">(abc)+</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abc</em>&#8220;, &#8220;<em style="color:darkgreen">abcabc</em>&#8220;, &#8220;<em style="color:darkgreen">abcabcabc</em>&#8220;, etc<br />
&#8220;<em style="color:#0077BB">ca(sca)?da</em>&#8221; coincide con &#8220;<em style="color:darkgreen">cascada</em>&#8221; y con &#8220;<em style="color:darkgreen">cada</em>&#8221;</p>
<h3>Escapar caracteres</h3>
<p>Si por ejemplo quisiéramos que en el patrón hubiese un punto, o un símbolo asterisco, sin que se interprete como metacaracter, tendremos que &#8220;escaparlo&#8221;. Esto se hace poniendo una barra invertida justo antes: \. o \*<br />
Esto puede hacerse con cualquier caracter que quieras introducir de <strong>forma literal</strong>, y no interpretada.</p>
<h2>Las funciones</h2>
<p>Una vez tenemos clara la sintaxis, nos pondremos manos a la obra con el código. En este caso usaremos las funciones que nos proporciona PHP, aúnque la sintaxis es común a muchos lenguajes.</p>
<h3>Funciones tipo POSIX</h3>
<p>Existen seis funciones de este tipo, que son las siguientes:</p>
<ul>
<li><strong><a href="http://es2.php.net/manual/es/function.ereg.php">ereg()</a></strong>. Devuelve true si se cumple el patrón, o false si no se cumple.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.eregi.php">eregi()</a></strong>. Igual que ereg(), pero sin distinguir <em>mayúsculas y minúsculas</em></li>
<li><strong><a href="http://es2.php.net/manual/es/function.ereg-replace.php">ereg_replace()</a></strong>. Usando la potencia de las expresiones regulares, permite modificar una cadena de texto.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.eregi-replace.php">eregi_replace()</a></strong>. Igual que la anterior, sin distinguir <em>minúsculas y mayúsculas</em>.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.split.php">split()</a></strong>. Divide una cadena en un array, según un patrón REGEX. Hace la misma tarea que la función explode, pero indicando una expresión regular como separador.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.spliti.php">spliti()</a></strong>. Igual que el anterior, sin diferenciar <em>minúscula y mayúscula</em>.</li>
</ul>
<h3>Funciones tipo PCRE</h3>
<p>Estas funciones son un poco más complejas, y consecuentemente más potentes. La diferencia más significativa en cuanto a sintaxis es que el patrón deberá estar <strong>delimitado por dos caracteres</strong>. Usualmente se usan barras ( / ), aunque podemos usar cualquier símbolo, como ( # ), sobretodo en un patrón que contenga barras. Otra diferencia importante son los <a href="http://es.php.net/manual/es/reference.pcre.pattern.modifiers.php">modificadores</a>.</p>
<ul>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-match.php">preg_match()</a></strong>. Chequea el patrón en una cadena alfanumérica. Devuelve true si coincide, o false en caso contrario. Además captura las coincidencias en un array.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-match-all.php">preg_match_all()</a></strong>. Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrón (no sólo una como es el caso de preg_match)</em></li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-replace.php">preg_replace()</a></strong>. Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza más de una sustitución con una sola función.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-split.php">preg_split()</a></strong>. Separa la cadena dada mediante una expresión regular.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-grep.php">preg_grep()</a></strong>. Busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.</li>
</ul>
<h2>Ejemplos prácticos</h2>
<p>A continuación muestro algunos ejemplos de uso de estas funciones:</p>
<p>Uso sencillo de preg_match.</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 código lee la variable $documento (HTML), y encuentra un numero en negrita</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$documento</span> = <span class="st0">&#8216;&lt;h1&gt;Numero&lt;/h1&gt; &lt;p&gt;El numero es &lt;strong&gt;720&lt;/strong&gt;, bla bla bla&lt;/p&gt;&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st0">&quot;#&lt;strong&gt;([0-9]+)&lt;/strong&gt;#is&quot;</span>,<span class="re0">$documento</span>,<span class="re0">$num</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$numero</span> = <span class="re0">$num</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</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="re0">$numero</span>; <span class="co1">// Devuelve 720</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Uso de la referencia hacia atrás en preg_match_all</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">// El \\2 es un ejemplo de referencia hacia atrás. Este le dice a pcre</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// que debe buscar el segundo conjunto de paréntesis en la expresión</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// regular misma, que sería ([\w]+) en este caso. La barra invertida</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// extra es requerida ya que la cadena se encuentra entre comillas</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// dobles.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$html</span> = <span class="st0">&quot;&lt;b&gt;texto en negrilla&lt;/b&gt;&lt;a href=hola.html&gt;haga clic aquí&lt;/a&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/preg_match_all"><span class="kw3">preg_match_all</span></a><span class="br0">&#40;</span><span class="st0">&quot;/(&lt;([<span class="es0">\w</span>]+)[^&gt;]*&gt;)(.*)(&lt;<span class="es0">\/</span><span class="es0">\\</span>2&gt;)/&quot;</span>, <span class="re0">$html</span>, <span class="re0">$coincidencias</span>, PREG_SET_ORDER<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$coincidencias</span> <span class="kw1">as</span> <span class="re0">$val</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;coincidencia: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 1: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 2: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 3: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Simple comprobación con el patrón de IP</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">// Funcion que comprueba si el dato pasado es una IP correcta</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> ipValida<span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&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;^[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}$&quot;</span>, <span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$tmp</span> = <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st0">&quot;.&quot;</span>, <span class="re0">$ip</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$tmp</span> <span class="kw1">as</span> <span class="re0">$sub</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sub</span> = <span class="re0">$sub</span> * <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$sub</span>&lt;<span class="nu0">0</span> || <span class="re0">$sub</span>&gt;<span class="nu0">256</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; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.ignside.net/man/php/regex.php">Expresiones Regulares (Ignside)</a>, lectura muy recomendada</li>
<li><a href="http://perl.plover.com/Regex/article.html">Funcionamiento interno de los RegEx (Inglés)</a>, si tienes curiosidad y entiendes inglés.</li>
<li><a href="http://regexlib.com/">Librería de expresiones regulares ya hechas</a>, para no reinventar la rueda.</li>
<li><a href="http://es.php.net/manual/es/reference.pcre.pattern.syntax.php">Referencia sintaxis de funciones PCRE</a> del manual oficial.</li>
<li><a href="http://es.php.net/manual/es/reference.pcre.pattern.modifiers.php">Referencia Modificadores</a> del manual oficial.</li>
<li><a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">Expresión Regular en Wikipedia</a></li>
<li><a href="http://www.wikilearning.com/introduccion_a_las_expresiones_regulares-wkc-419.htm">Tutorial de Expresiones Regulares en Wikilearning</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Formas de ejecutar funciones en PHP</title>
		<link>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/</link>
		<comments>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 16:47:37 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Comparativa]]></category>
		<category><![CDATA[Curioso]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/php/formas-de-ejecutar-funciones-en-php/</guid>
		<description><![CDATA[Aúnque a algunos les parezca extraño, existen tres formas distintas de ejecutar una función en PHP (por lo menos que yo conozca). Cada una puede venir bien en situaciones distintas. Lo primero de todo, crearemos un par de funciones. function menor&#40;$a,$b&#41;&#123; return $a&#60;$b ? $a : $b; &#125; function mayor&#40;$a,$b&#41;&#123; return $a&#62;$b ? $a : [...]]]></description>
			<content:encoded><![CDATA[<p>Aúnque a algunos les parezca extraño, existen <strong>tres formas distintas de ejecutar una función en PHP</strong> (por lo menos que yo conozca). Cada una puede venir bien en situaciones distintas.</p>
<p>Lo primero de todo, crearemos un par de funciones.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> menor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">return</span> <span class="re0">$a</span>&lt;<span class="re0">$b</span> ? <span class="re0">$a</span> : <span class="re0">$b</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> mayor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">return</span> <span class="re0">$a</span>&gt;<span class="re0">$b</span> ? <span class="re0">$a</span> : <span class="re0">$b</span>; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>La función <strong>menor</strong>() devuelve el menor de los dos números pasados como parámetros. La función <strong>mayor</strong>() hará lo contrario.</p>
<h2>La forma clásica</h2>
<p>La forma más típica de ejecutar una función, es símplemente <strong>escribiendo su nombre, seguido de unos paréntesis</strong>, con los parámetros separados por comas. De esta forma, al escribir:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">12</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$b</span> = <span class="nu0">5</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;Entre $a y $b, el menor es &quot;</span>,menor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Nos devolvería el siguiente texto:</p>
<blockquote><p>Entre 12 y 5, el menor es 5</p></blockquote>
<h2>Con la función call_user_func(_array)</h2>
<p>Las función <a href="http://es2.php.net/manual/es/function.call-user-func.php">call_user_func</a>  nos permite ejecutar una función, dado el nombre en cadena alfanumérica.</p>
<p>La diferencia con <a href="http://es2.php.net/manual/es/function.call-user-func-array.php">call_user_fucn_array</a>, es que en esta última los parámetros son pasados en un array.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;comparacion&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&#8216;menor&#8217;</span><span class="br0">&#41;</span> <span class="re0">$func</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="re0">$func</span> = <span class="st0">&#8216;mayor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">17</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$b</span> = <span class="nu0">32</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> <a href="http://www.php.net/call_user_func"><span class="kw3">call_user_func</span></a><span class="br0">&#40;</span><span class="re0">$func</span>,<span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Dependiendo de la variable GET comparación, se ejecutará una función u otra. La alternativa con call_user_func_array es:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;comparacion&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&#8216;menor&#8217;</span><span class="br0">&#41;</span> <span class="re0">$func</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="re0">$func</span> = <span class="st0">&#8216;mayor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">17</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$b</span> = <span class="nu0">32</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> <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">&#40;</span><span class="re0">$func</span>,<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">//parametros en forma de array</span></div>
</li>
</ol>
</div>
<h2>Directamente de una cadena</h2>
<p>Esta es una forma sorprendente de ejecutar funciones. Parte de lo mismo que la anterior, el nombre de la función en una <strong>variable alfanumérica</strong>. Pero en este caso puede ser tratada directamente como función, así por la cara.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$funcion</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$funcion</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">5</span><span class="br0">&#41;</span>; <span class="co1">//Devuelve 2</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$funcion</span><span class="br0">&#40;</span><span class="nu0">8</span>,<span class="nu0">-12</span><span class="br0">&#41;</span>; <span class="co1">//Devuelve -12</span></div>
</li>
</ol>
</div>
<p>Esta libertad recuerda a <strong>JavaScript</strong>, donde pueden <em>igualarse</em> variables a funciones de forma muy sencilla.</p>
<p>Conocéis alguna forma más? Os parece útil disponer de diferentes métodos para llamar a funciones?</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Leer y escribir Zip en PHP sin complicarse la vida</title>
		<link>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/</link>
		<comments>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 12:36:58 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/boozox/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/</guid>
		<description><![CDATA[Lo que hoy quiero mostraros es una genial librería, que facilita increíblemente el manejo de archivos zip con PHP; únicamente habrá que incluir un archivo a nuestro código, para gozar de toda su funcionalidad para abrir, explorar y crear archivos de tipo Zip. Instanciación El primer paso para usar esta librería es siempre el mismo, [...]]]></description>
			<content:encoded><![CDATA[<p>Lo que hoy quiero mostraros es una <a href="http://www.phpconcept.net/pclzip/index.en.php">genial librería</a>, que facilita increíblemente el <strong>manejo de archivos zip con PHP</strong>; únicamente habrá que incluir un archivo a nuestro código, para gozar de toda su funcionalidad para <em>abrir,</em> <em>explorar</em> y <em>crear</em> archivos de tipo Zip.</p>
<h2>Instanciación</h2>
<p>El primer paso para usar esta librería es siempre el mismo, independientemente de lo que queramos hacer:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Como se observa, hemos <strong>incluido</strong> el fichero de la librería, y hemos <strong>instanciado</strong> la clase PclZip, con un nombre de archivo.<br />
Este nombre de archivo puede ser uno <em>existente</em>, que queremos manipular, o uno <em>inexistente</em>, que queremos crear a continuación. Será más adelante cuando le indicamos lo que queremos hacer con archivo.zip (<em>leer o escribir</em>), hasta aquí únicamente lo hemos referenciado.</p>
<p><span id="more-171"></span><br />
<h2>Lectura</h2>
<p>En caso de que el archivo Zip sí exista, y queramos <strong>explorar</strong> su contenido, tenemos varias alternativas.</p>
<p>La primera es usar el método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-listcontent">listContent()</a></strong>, el cual nos devuelve una lista de propiedades de los archivos y carpetas contenidos en el archivo zip.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</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">$zip</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;test.zip&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="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$list</span> = <span class="re0">$zip</span>-&gt;<span class="me1">listContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</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/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$zip</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</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="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span>=<span class="nu0">0</span>; <span class="re0">$i</span>&lt;sizeof<span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#41;</span>; <span class="re0">$i</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.php.net/reset"><span class="kw3">reset</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="re0">$key</span> = <a href="http://www.php.net/key"><span class="kw3">key</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <a href="http://www.php.net/next"><span class="kw3">next</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Archivo $i / [$key] = &quot;</span>.<span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$key</span><span class="br0">&#93;</span>.<span class="st0">&quot;&lt;br&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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;br&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Lo cual nos devuelve algo como esto:</p>
<pre>File 0 / [filename] = data/file1.txt
Archivo 0 / [stored_filename] = data/file1.txt
Archivo 0 / [size] = 53
Archivo 0 / [compressed_size] = 36
Archivo 0 / [mtime] = 1010440428
Archivo 0 / [comment] =
Archivo 0 / [folder] = 0
Archivo 0 / [index] = 0
Archivo 0 / [status] = ok

Archivo 1 / [filename] = data/file2.txt
Archivo 1 / [stored_filename] = data/file2.txt
Archivo 1 / [size] = 54
Archivo 1 / [compressed_size] = 53
Archivo 1 / [mtime] = 1011197724
Archivo 1 / [comment] =
Archivo 1 / [folder] = 0
Archivo 1 / [index] = 1
Archivo 1 / [status] = ok</pre>
<p>Si nos interesa más <strong>extraer</strong> el contenido descomprimiendo archivos y carpetas, tendremos que usar el método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-extract">extract()</a></strong>, el cual nos brinda muchas opciones. Veamos un ejemplo:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</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">if</span> <span class="br0">&#40;</span><span class="re0">$archivo</span>-&gt;<span class="me1">extract</span><span class="br0">&#40;</span>PCLZIP_OPT_PATH, <span class="st0">&quot;data&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">PCLZIP_OPT_REMOVE_PATH, <span class="st0">&quot;install/release&quot;</span><span class="br0">&#41;</span> == <span class="nu0">0</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/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>En este ejemplo todos los archivos se extraen en la carpeta &#8220;data&#8221;. Todos los archivos cuya ruta empiece por &#8220;install/release&#8221;, serán extraidos directamente en &#8220;data&#8221;, y no en &#8220;data/install/release&#8221;.</p>
<p>Existen muchas opciones con las que indicar exactamente lo que queremos que haga al extraer nuestros archivos. Puedes consultarlas en la <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?options">documentación</a></strong>.</p>
<h2>Escritura</h2>
<p>Si tu intención es <strong>crear</strong> un archivo zip &#8220;al vuelo&#8221;, esta librería también va a yudarte, gracias al método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-create">create()</a></strong>, que creará un archivo zip con los archivos y carpetas que le indiquemos. Si le indicamos una carpeta, automáticamente incluirá todo el contenido en su interior. Además mantendrá la estructura de carpetas intacta dentro del archivo zip que creemos.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</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">$v_list</span> = <span class="re0">$archivo</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span><span class="st0">&quot;data/file.txt,data/text.txt&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; PCLZIP_OPT_REMOVE_PATH, <span class="st0">&quot;data&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; PCLZIP_OPT_ADD_PATH, <span class="st0">&quot;install&quot;</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">$v_list</span> == <span class="nu0">0</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/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>En el anterior código los archivos &#8220;file.txt&#8221; y &#8220;text.txt&#8221;, que se encuentran en la carpeta &#8220;data&#8221;, en el archivo zip creado se encontrarán en la carpeta &#8220;install&#8221;.</p>
<p>La librería nos permite manipular archivos zip con toda comodidad, usando los métodos <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-add">add()</a></strong>, <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-delete">delete()</a></strong> o <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-merge">merge()</a></strong> , que añade archivos, elimina archivos, y fusiona archivos, respectivamente.</p>
<p>Ejemplo de añadir archivos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</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">$v_list</span> = <span class="re0">$archivo</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;file.txt,data/text.txt,folder/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$v_list</span> == <span class="nu0">0</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/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Como podéis ver, se trata de una librería <strong>completa</strong> y <strong>funcional</strong>. Recomiendo su uso frente a otras alternativas.</p>
<p>Si quieres ver un ejemplo de su uso, puedes echar un vistazo al <a href="http://codis.boozox.net/zip/URL::codis.boozox.net/bin/imaset_2-0.zip">explorador de archivos zip</a> que he incorporado en Codis.</p>
<p style="text-align:center;font-size:20px;"><a href="http://boozox.net/jaula/pclzip-2-6.zip">Descargar pclzip-2-6.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

