Estoy usando Curl a través de Proxies para descargar imágenes con un raspador que he desarrollado.PHP: Determine las imágenes corruptas visualmente (aún válidas) descargadas a través de Curl con GD/Imagemagick
Por desgracia, se pone la extraña imagen que se parece a estos y la última es completamente en blanco:/
- Cuando pruebo las imágenes a través de ImageMagick (usando identificar) me dice que son imágenes válidas.
- Cuando pruebo las imágenes a través de exif_imagetype() y imagecreatefromjpeg() nuevamente, ambas funciones me dicen que las imágenes son válidas.
¿Alguien tiene una manera de determinar si la imagen tiene una mayoría de grisáceo o está completamente en blanco/blanco y estas son de hecho imágenes dañadas?
He realizado muchas comprobaciones con otras preguntas aquí, pero no he tenido mucha suerte con otras soluciones. Por favor, tenga cuidado al sugerir que este es un duplicado.
Gracias
Después de conocer acerca imgcolorat, hice una búsqueda y topé con algo de código. Se me ocurrió esto:
<?php
$file = dirname(__FILE__) . "/images/1.jpg";
$img = imagecreatefromjpeg($file);
$imagew = imagesx($img);
$imageh = imagesy($img);
$xy = array();
$last_height = $imageh - 5;
$foo = array();
$x = 0;
$y = 0;
for ($x = 0; $x <= $imagew; $x++)
{
for ($y = $last_height;$y <= $imageh; $y++)
{
$rgb = @imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
if ($r != 0)
{
$foo[] = $r;
}
}
}
$bar = array_count_values($foo);
$gray = (isset($bar['127']) ? $bar['127'] : 0) + (isset($bar['128']) ? $bar['128'] : 0) + (isset($bar['129']) ? $bar['129'] : 0);
$total = count($foo);
$other = $total - $gray;
if ($gray > $other)
{
echo "image corrupted \n";
}
else
{
echo "image not corrupted \n";
}
?>
¿Alguien ve algunas trampas potenciales con esto? Pensé en obtener las últimas filas de la imagen y luego comparar el total de r 127,128,129 (que son grises) con el total de otros colores. Si el gris es mayor que los otros colores, la imagen seguramente se corrompe.
¡Bienvenido! :)
Hmm. Si todas esas funciones dicen que es una imagen válida, probablemente solo verifiquen los bytes del encabezado, pero no miran si todo el archivo realmente está * allí *. Esperaría que haya un byte de encabezado que especifique el esperado con, pero no sé con certeza si existe tal cosa –