Actualizar
También implementé la siguiente solución en mi script de Python aquí en GitHub .
También verifiqué que los archivos dañados (jpg) con frecuencia no son imágenes 'rotas', es decir, un archivo de imagen dañado a veces sigue siendo un archivo de imagen legítimo, la imagen original se pierde o se altera, pero aún puede cargarla sin errores. Pero, el truncamiento de archivos siempre causa errores.
Finalizar actualización
Puede usar el módulo Python Pillow (PIL), con la mayoría de los formatos de imagen, para verificar si un archivo es un archivo de imagen válido e intacto.
En el caso de que pretenda detectar también imágenes rotas, @Nadia Alramli sugiere correctamente el im.verify()
método, pero este no detecta todos los posibles defectos de imagen , por ejemplo, im.verify
no detecta imágenes truncadas (que la mayoría de los espectadores suelen cargar con un área en gris).
Pillow también puede detectar este tipo de defectos, pero debe aplicar la manipulación de imágenes o decodificar / recodificar la imagen o activar la verificación. Finalmente sugiero usar este código:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
En caso de defectos de imagen, este código generará una excepción. Tenga en cuenta que im.verify es aproximadamente 100 veces más rápido que realizar la manipulación de imágenes (y creo que voltear es una de las transformaciones más baratas). Con este código vas a verificar un conjunto de imágenes a unos 10 MBytes / seg con Pillow estándar o 40 MBytes / seg con módulo Pillow-SIMD (CPU moderna x86_64 de 2.5Ghz).
Para los otros formatos psd , xcf , .. puedes usar Imagemagick wrapper Wand , el código es el siguiente:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Pero, a partir de mis experimentos, Wand no detecta imágenes truncadas, creo que carga las partes que faltan como un área en gris sin preguntar.
Red que Imagemagick tiene una identificación de comando externa que podría hacer el trabajo, pero no he encontrado una manera de invocar esa función programáticamente y no he probado esta ruta.
Sugiero que siempre haga una comprobación preliminar, compruebe el tamaño del archivo a no ser cero (o muy pequeño), es una muy barato idea:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case