Laboratorio: Comparar imágenes mediante PHP
16:45 H (CET)| Temas: How to · Laboratorio · PHP
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 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.
El funcionamiento del script es sencillo:
- 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).
- Se cargan las dos imágenes.
- 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.
- 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.
- 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.
- 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.
<?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) && 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<ImageSY($im1); $j++) {
for ($i= 0; $i<ImageSX($im1); $i++) {
$rgb1 = imagecolorat($im1, $i, $j);
$rgb2 = imagecolorat($im2, $i, $j);
if ($rgb1 != $rgb2) {
$ok = true;
$xmin = ($i < $xmin)? $i : $xmin;
$ymin = ($j < $ymin)? $j : $ymin;
$xmax = ($i > $xmax)? $i : $xmax;
$ymax = ($j > $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);
}
?>
Relacionados
Feedback (10) » Formulario
1. Andres Arena ~ Miércoles, 02 Ago 2006 | 00:30H:
Me da este ERROR
Warning: imagecreatefrompng() [function.imagecreatefrompng]: '/home/colegiov/public_html/' is not a valid PNG file in /home/colegiov/public_html/dosiguales.php on line 6
Warning: Cannot modify header information - headers already sent by (output started at /home/colegiov/public_html/dosiguales.php:6) in /home/colegiov/public_html/dosiguales.php on line 8
Warning: imagepng(): supplied argument is not a valid Image resource in /home/colegiov/public_html/dosiguales.php on line 9
puedes verlo en el link que envio
2. Luis ~ Miércoles, 02 Ago 2006 | 08:22H:
Parece ser que cuando abres la imagen con la función imagecreatefrompng, el archivo png que le pasas no es una imagen PNG, aunque tenga la extensión PNG, no tiene por qué serlo. El programa IrfanView tiene una característica que me gusta, que cuando una imagen con un formato tiene una extensión incorrecta, te avisa y te lo renombra.
Si tu imagen es JPEG puedes usar el método imagecreatefromjpeg y si es GIF el método imagecreatefromgif.
Saludos
3. Andres Arena ~ Miércoles, 02 Ago 2006 | 23:38H:
Gracias por tu respuesta, ya solucione el prblema era la ruta, ahora funciona bien y te felicito lo probe alterando solo un pixel y es capas de distinguir el cambio, seguire ahora con la parte del codigo para ubicar el dato segun la imagen asociada.
5. Abrahan ~ Miércoles, 09 May 2007 | 06:24H:
Hola quiero saber si este metodo de comparacion me puede servir para comparar una de muchas imgenes de huellas dactilares, si me pueden ayudar se los agradesco....
7. Abrahan ~ Miércoles, 09 May 2007 | 08:10H:
saben donde puedo conseguir informción relacionada con este tema, que se en php por que de verdad me urge hacer esto
9. manuel ~ Miércoles, 19 Sep 2007 | 05:30H:
luis, sabes necesito saber si este codigo puedo pasarlo a visual basic studio .net 2005
me seria de mucha ayuda gracias espero que me respondas al email


