2009-09-09 20 views
15

Bien. Entonces tengo alrededor de 250,000 imágenes de alta resolución. Lo que quiero hacer es ir a través de todos ellos y encontrar los que están corruptos. Si sabe lo que es 4scrape, entonces usted sabe que la naturaleza de las imágenes I.¿Cómo compruebo programáticamente si una imagen (PNG, JPEG o GIF) está dañada?

dañado, para mí, es la imagen se carga en Firefox y dice

The image “such and such image” cannot be displayed, because it contains errors.

Ahora , Podría seleccionar todas mis 250,000 imágenes (~ 150 gb) y arrastrarlas y soltarlas en Firefox. Eso sería malo, porque no creo que Mozilla haya diseñado Firefox para abrir 250,000 pestañas. No, necesito una forma de verificar programáticamente si una imagen está dañada.

¿Alguien sabe una biblioteca de PHP o Python que puede hacer algo en esta línea? ¿O una pieza de software existente para Windows?

Ya he eliminado imágenes obviamente corruptas (como las que tienen 0 bytes), pero estoy aproximadamente 99.9% seguro de que hay más imágenes enfermas flotando en mi multitud de una colección.

+3

lol Lo leí como "imágenes enfermas flotando en mi colección THONG" +1 para una buena pregunta. –

Respuesta

22

Un Una forma fácil sería intentar cargar y verificar los archivos con PIL (Biblioteca de imágenes de Python).

from PIL import Image 

v_image = Image.open(file) 
v_image.verify() 

detectar las excepciones ...

De the documentation:

im.verify()

trata de determinar si el archivo se ha roto, sin decodificar la imagen en realidad datos. Si este método encuentra algún problema, genera excepciones adecuadas. Este método solo funciona en una imagen recién abierta; si la imagen ya se ha cargado, el resultado no está definido. Además, si necesita cargar la imagen después de usar este método, debe volver a abrir el archivo de imagen.

+0

Esto funciona para algunas de las imágenes dañadas. La ventaja de este método es que es muy rápido. Gracias ChristopheD! –

+2

Esta solución es tan simple que la he envuelto en un script de Python para buscar de forma recursiva archivos corruptos. Estoy publicando aquí con la esperanza de que ayude a alguien más: http://bitbucket.org/denilsonsa/small_scripts/src –

+0

@ DenilsonSá Si edito la línea 32: 'self.globs = ['* .jpg', '*. jpe ',' * .jpeg '] 'en jpeg_corrupt.py, para incluir' * .png' y '* .gif', ¿el resto del código funcionaría bien en la verificación de imágenes PNG y GIF también? – galacticninja

6

le sugiero que echa un vistazo a ImageMagick para esto: http://www.imagemagick.org/

allí se tiene una herramienta llamada identificar qué se puede utilizar en combinación con una secuencia de comandos/salida estándar o puede utilizar la interfaz de programación proporcionada

+1

¿Cuál es su opinión (o la de cualquiera) sobre GraphicsMagick que se supone que es una bifurcación más estable de ImageMagick? – Todd

+0

nunca jugué con eso, pero lo intentaré, gracias por la información – Niko

+0

Tenga en cuenta que identificar se ve solo en el encabezado, por lo que debe ser rápido, pero no es una garantía contra una imagen dañada. Aunque estoy seguro de que otros fragmentos de imagemagick pueden proporcionar un control más completo. –

3

Si sus requisitos son que muestra correctamente en Firefox usted puede tener un momento difícil - la única manera de estar seguro que sería de enlazar con el mismo código fuente de la imagen exacta de carga como Firefox.

La corrupción de la imagen básica (el archivo está incompleto) se puede detectar simplemente tratando de abrir el archivo utilizando cualquier cantidad de bibliotecas de imágenes.

Sin embargo, muchas imágenes pueden no mostrarse simplemente porque estiran una parte del formato de archivo que el visor particular que está utilizando no puede manejar (GIF en particular tiene muchos de estos casos extremos, pero puede encontrar JPEG y el raro archivo PNG que solo puede mostrarse en visores específicos).También hay algunos casos de bordes JPEG feos donde el archivo aparece como para ser incorregible en el visor X, pero en realidad el archivo se ha cortado y solo se muestra correctamente porque se ha perdido muy poca información (FireFox puede mostrar algunos JPEG cortados correctamente [se obtiene un fondo gris], pero otros resultan en FireFox aparente de la carga a mitad de camino y luego mostrar el mensaje de error en lugar de la imagen parcial)

5

en PHP, con exif_imagetype():

if (exif_imagetype($filename) === false) 
{ 
    unlink($filename); // image is corrupted 
} 

EDITAR: O puede intentar cargar la imagen por completo con ImageCreateFromString():

if (ImageCreateFromString(file_get_contents($filename)) === false) 
{ 
    unlink($filename); // image is corrupted 
} 

Un recurso de imagen será devuelta a la éxito. FALSO se devuelve si el tipo de imagen es no compatible, los datos son no en un formato reconocido, o la imagen es corrupto y no puede ser cargado.

+0

Eso solo lee los primeros bytes buscando un encabezado de imagen, eso no será suficiente para confirmar que la imagen no está dañada. –

+0

(aunque es mejor que nada, y sería rápido) –

+0

@dherefromhere: gracias, lo arregló. –

0

Podría usar ImageMagick si está disponible:

si usted quiere hacer una carpeta completa

identify "./myfolder/*" >log.txt 2>&1 

si quieres simplemente comprobar un archivo:

identify myfile.jpg 
+0

Eso no parece funcionar. El uso del interruptor '-verbose' capta * algunas * imágenes dañadas, pero también ** drásticamente ** aumenta el tiempo para procesar cada archivo. – Synetech

+0

Depende de la corrupción, supongo? Esto encontrará imágenes que están dañadas en los primeros bytes (o donde los identifique como el tipo de imagen). Es esencialmente lo mismo que usar la función 'exif_imagetype()' en php – SeanJA

+0

Desafortunadamente eso no es muy útil. La corrupción del encabezado/número mágico es bastante trivial. Lo que se necesita es algo que pueda verificar si la imagen se ajusta a las especificaciones del formato (que también tiene el efecto secundario de descubrir imágenes de Stego). – Synetech

Cuestiones relacionadas