<?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>Sentido Web &#187; laboratorio php</title>
	<atom:link href="http://sentidoweb.com/tag/laboratorio-php/feed" rel="self" type="application/rss+xml" />
	<link>http://sentidoweb.com</link>
	<description>Desarrollo web, HTML, CSS, Javascript, PHP, MySQL</description>
	<lastBuildDate>Tue, 10 Apr 2012 01:02:09 +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>Laboratorio: Comparar imágenes mediante PHP</title>
		<link>http://sentidoweb.com/2006/04/18/laboratorio-comparar-imagenes-mediante-php.php</link>
		<comments>http://sentidoweb.com/2006/04/18/laboratorio-comparar-imagenes-mediante-php.php#comments</comments>
		<pubDate>Tue, 18 Apr 2006 23:45:00 +0000</pubDate>
		<dc:creator>displaynone</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Laboratorio]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[laboratorio imágenes]]></category>
		<category><![CDATA[laboratorio php]]></category>
		<category><![CDATA[php comparar imágenes]]></category>

		<guid isPermaLink="false">http://sentidoweb.com/2006/04/18/laboratorio-comparar-imagenes-mediante-php.php</guid>
		<description><![CDATA[Voy a intentar responder de una forma un poco más completa la pregunta que nos hacía David sobre la forma de comparar dos imágenes. Aunque este tema es muy intenso y en algunos casos bastante complicado, vamos a intentar simplificarlo en dos casos: imágenes de distinto tamaño y distinto contenido en la imagen. Si las [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a intentar responder de una forma un poco más completa la <a href="http://sentidoweb.com/2006/04/11/laboratorio-recorta-imagenes-dinamicamente-con-php-y-html.php#comentario_282">pregunta</a> que nos hacía David sobre la forma de comparar dos imágenes. Aunque este tema es muy intenso y en algunos <a href="http://www.riya.com/">casos</a> bastante complicado, vamos a intentar simplificarlo en <a href="http://sentidoweb.com/lab/comparar/php/comparar.html">dos casos</a>: imágenes de distinto tamaño y distinto contenido en la imagen.</p>
<p><a href="http://sentidoweb.com/lab/comparar/php/comparar.html"><img alt="Comparar imágenes" src="http://sentidoweb.com/img/2006/04/comparar-imagenes.png" width="354" height="199" class="center"/></a></p>
<p>Si las imágenes son de distinto tamaño diremos que son distintas imágenes, no nos pararemos a ver el contenido. Si tienen el mismo tamaño, buscaremos que parte de la imagen es la que ha cambiado y la señalaremos con un rectángulo rojo.</p>

<span id="more-141"></span>
<p>El funcionamiento del script es sencillo:</p>
<ul><li>Primero recibimos las dos imágenes (en este caso ambas son PNG para facilitar el script), si la imagen seleccionada no se ha elegido, se devuelve la imagen original (esto es solo para evitar dar un error).</li>
<li>Se cargan las dos imágenes.</li>
<li>Si las imágenes tienen distinto tamaño se devuelve una imagen del tamaño de la original con un texto que indica que son de distinto tamaño.</li>
<li>Si las imágenes tienen el mismo tamaño se comprueba el contenido de ambas, se van recorriendo ambas imágenes punto a punto (usando coordenadas x e y) comprobando el color rgb de ambas.</li>
<li>Si no ha habido diferencias entre las imágenes se devuelve una imagen del tamaño de la original con un texto que indica que son la misma imagen.</li>
<li>Cuando se encuentra un punto con distinto color en las dos imágenes, se comprueba si el punto es el que tiene menor X o menor Y encontrado y si es así nos quedamos con la coordenada X o Y menor, igual para el punto mayor. Así lo que conseguimos es el recuadro que enmarca todos los puntos diferentes entre ambas imágenes. Cuando hemos acabado de recorrer las imágenes, devolvemos la imagen seleccionada con el recuadro dibujado.</li></ul>
<pre><code>&lt;?php
// Cargamos las imágenes
$origen = $_GET["img1"];
$destino = $_GET["img2"];
$im1 = imagecreatefrompng (getcwd()."/".$origen);
if (!$destino) {
header("Content-type: image/png");
imagepng($im1);
} else {
$im2 = imagecreatefrompng (getcwd()."/".$destino);
// Creamos la imagen resultante
$im3 = imagecreate(ImageSX($im1), ImageSY($im1));
if (ImageSX($im1) == ImageSX($im2) &#038;&#038; ImageSY($im1) == ImageSY($im2)) {
// Tienen el mismo tamaño
$rojo = imagecolorallocate($im3, 255, 0, 0);
// Compruebo la zona que tiene distintos pixels
$xmin = ImageSX($im1);
$xmax = 0;
$ymin = ImageSY($im1);
$ymax = 0;
$ok = false;
for ($j= 0; $j&lt;ImageSY($im1); $j++) {
for ($i= 0; $i&lt;ImageSX($im1); $i++) {
$rgb1 = imagecolorat($im1, $i, $j);
$rgb2 = imagecolorat($im2, $i, $j);
if ($rgb1 != $rgb2) {
$ok = true;
$xmin = ($i &lt; $xmin)? $i : $xmin;
$ymin = ($j &lt; $ymin)? $j : $ymin;
$xmax = ($i &gt; $xmax)? $i : $xmax;
$ymax = ($j &gt; $ymax)? $j : $ymax;
}
}
}
if (!$ok) {
// Son iguales
$negro = imagecolorallocate($im3, 0, 0, 0);
imagestring($im3, 10, 5, 5, "Son iguales", $negro);
} else {
// Son distintas
// Copio la imagen 2 sobre la resultante
imagecopy($im3, $im2, 0, 0, 0, 0, ImageSX($im2), ImageSY($im2));
// Señalo donde difieren
imagerectangle($im3, $xmin, $ymin, $xmax, $ymax, $rojo);
}
} else {
$rojo = imagecolorallocate($im3, 255, 0, 0);
$negro = imagecolorallocate($im3, 0, 0, 0);
imagestring($im3, 10, 5, 5, "Distinto ancho y alto", $negro);
}
/* Devolvemos la imagen */
header("Content-type: image/png");
imagepng($im3);
}
?&gt;</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://sentidoweb.com/2006/04/18/laboratorio-comparar-imagenes-mediante-php.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laboratorio: Recorta imágenes dinámicamente con PHP y HTML</title>
		<link>http://sentidoweb.com/2006/04/11/laboratorio-recorta-imagenes-dinamicamente-con-php-y-html.php</link>
		<comments>http://sentidoweb.com/2006/04/11/laboratorio-recorta-imagenes-dinamicamente-con-php-y-html.php#comments</comments>
		<pubDate>Tue, 11 Apr 2006 22:18:12 +0000</pubDate>
		<dc:creator>displaynone</dc:creator>
				<category><![CDATA[Grafismo]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Laboratorio]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[crop]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[laboratorio imágenes]]></category>
		<category><![CDATA[laboratorio php]]></category>
		<category><![CDATA[recortar]]></category>
		<category><![CDATA[recortar imagenes php]]></category>

		<guid isPermaLink="false">http://sentidoweb.com/2006/04/11/laboratorio-recorta-imagenes-dinamicamente-con-php-y-html.php</guid>
		<description><![CDATA[En muchos sitios web de almacenamiento de imágenes se nos permite retocar las imágenes. Hoy vamos a explicar como recortar una imagen directamente desde una página web. Para ello tenemos que crearnos una página web que nos permita seleccionar la zona de la imagen que queremos recortar y de un script PHP que usando la [...]]]></description>
			<content:encoded><![CDATA[<p>En muchos sitios web de almacenamiento de imágenes se nos permite retocar las imágenes. Hoy vamos a explicar como recortar una imagen directamente desde una página web.
<a href="http://sentidoweb.com/lab/recortar/php/recortar.html"><img alt="crop.png" src="http://sentidoweb.com/img/2006/04/crop.png" width="400" height="239" class="center"/></a>
Para ello tenemos que crearnos una página web que nos permita seleccionar la zona de la imagen que queremos recortar y de un script PHP que usando la librería GD recortará la imagen y la devolverá en formato PNG.</p>

<span id="more-125"></span>
<p>Primero es crear la página web que muestra la imagen y permite recortarla. Constará de una capa que contiene la imagen y de otra capa (<em>span</em>) que se usará para crear el marco de selección. Bueno, también hay una capa que mostrará la imagen resultante, pero esto no es necesario, solo es para mostrar el resultado en la misma página.</p>
<p>El HTML necesario para contener la imagen es el siguiente:</p>
<pre><code>&lt;div class="contenedor"
onclick="posicionaMarco(event)"
onmousemove="despliegaMarco(event)"&gt;
&lt;img src="<em>foto.jpg</em>" alt="Foto" /&gt;
&lt;span id="marco"&gt;&lt;/span&gt;
&lt;/div></code></pre>
<p>La capa <em>contenedor</em> tendrá dos eventos que serán controlados:</p>
<ul><li><em>onclick</em>: cuando se pincha en la imagen se empecerá/finalizará la selección de la zona de la imagen que queremos recortar.</li>
<li><em>onmousemove</em>: mientras se mueva el ratón por la imagen se creará el marco que indica que zona de la imagen se está seleccionando. En este caso, para no complicar la explicación del efecto, obligamos a que la selección se haga de izquierda-derecha y de arriba-abajo.</li>
</ul>
<p>Los estilos solo hay que destacar que la capa contenedora debe tener el mismo tamaño que la imagen para evitar seleccionar más de la cuenta y que luego falle el script PHP, y que la capa marco debe tener el borde visible, en este caso sólido, rojizo y de 2 píxeles de grosor.</p>
<p>Cuando pinchamos en la imagen almacenamos la posición <em>x</em> e <em>y</em> del ratón, ya que será la esquina superior izquierda y luego inicializar los valores del marco.</p>
<pre><code>var _IE_ = navigator.userAgent.indexOf("MSIE") != -1; // Si es IE
var inicio = false;
var xini = 0;
var yini = 0;
var xfin = 0;
var yfin = 0;
function posicionaMarco(e) {
inicio = !inicio;
var marco = document.getElementById("marco");
if (inicio) {
marco.style.display = "block";
// En IE y Opera se usa otra propiedad del evento
if (_IE_) {
xini = e.offsetX;
yini = e.offsetY;
} else {
xini = e.layerX;
yini = e.layerY;
}
marco.style.left = xini+"px";
marco.style.top = yini+"px";
marco.style.width = "0px";
marco.style.height = "0px";
}
}</code></pre>
<p>Cuando se mueve el ratón por la superficie de la imagen (realmente de la capa), almacenamos la esquina inferior derecha del marco y modificamos el ancho y alto.</p>
<pre><code>function despliegaMarco(e) {
if (inicio) {
var marco = document.getElementById("marco");
// En IE y Opera se usa otra propiedad del evento
// El 7 es para evitar que el ratón se solape con el marco y nos dé problemas
if (_IE_) {
xfin = e.offsetX-7;
yfin = e.offsetY-7;
} else {
xfin = e.layerX-7;
yfin = e.layerY-7;
}
// El 5 es para que haya un tamaño mínimo
if (xfin > xini+5) {
marco.style.width = (xfin-xini)+"px";
}
if (yfin > yini+5) {
marco.style.height = (yfin-yini)+"px";
}
}
}</code></pre>
<p>Ya tenemos el HTML que nos permite seleccionar la zona de la imagen, ahora solo hace falta el script PHP. El funcionamiento es sencillo, carga la imagen, crea una imagen nueva con el tamaño final que debe tener y copiamos la zona que queremos recortar de la imagen en la nueva imagen. Por último devolvemos la imagen nueva.</p>
<pre><code>&lt;?php
// Abre la imagen
$fichero = getcwd()."/".$_GET["img"];
if (preg_match('/.png$/', $fichero)) {
$img = imagecreatefrompng($fichero);
} else if (preg_match('/.gif$/', $fichero)) {
$img = imagecreatefromgif($fichero);
} else if (preg_match('/.jpg$/', $fichero)) {
$img = imagecreatefromjpeg($fichero);
}
$xini = $_GET["xini"];
$yini = $_GET["yini"];
$xfin = $_GET["xfin"];
$yfin = $_GET["yfin"];
$res = imagecreatetruecolor (
$xfin-$xini, $yfin-$yini);
imagecopy($res, $img, 0, 0,
$xini, $yini,
$xfin-$xini, $yfin-$yini);
header("Content-type: image/png");
imagepng($res);
?&gt;</code></pre>
<p>Se le pueden añadir más funcionalidades, pero para ir empezando creo que está bien así.</p>
<p><a href="http://sentidoweb.com/lab/recortar/php/recortar.html">Ejemplo</a></p>
<p>Te puedes bajar las fuentes <a href="http://sentidoweb.com/lab/recortar/php/recortar.zip">aquí</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sentidoweb.com/2006/04/11/laboratorio-recorta-imagenes-dinamicamente-con-php-y-html.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

