python - ¿Cómo verificar si un archivo es un archivo de imagen válido?
identification imghdr (7)
Actualmente estoy usando PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
Sin embargo, aunque esto cubre suficientemente la mayoría de los casos, algunos archivos de imagen como, xcf, svg y psd no se están detectando. Los archivos Psd arrojan una excepción OverflowError.
¿De alguna forma podría incluirlos también?
¿Sería aceptable comprobar las extensiones de archivo o está intentando confirmar que los datos en sí representan un archivo de imagen?
Si puede verificar la extensión del archivo, una expresión regular o una comparación simple podría satisfacer el requisito.
Acabo de encontrar el módulo imghdr incorporado. De la documentación de Python:
El módulo imghdr determina el tipo de imagen contenida en un archivo o secuencia de bytes.
Así es como funciona:
>>> import imghdr
>>> imghdr.what(''/tmp/bass'')
''gif''
Usar un módulo es mucho mejor que volver a implementar una funcionalidad similar
Además de lo que Brian sugiere, podrías usar el método de verify de PIL para verificar si el archivo está roto.
im.verify ()
Intenta determinar si el archivo está roto, sin realmente decodificar los datos de la imagen. 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. Atributos
Bueno, no sé sobre el interior de psd, pero yo, claro, sé que, de hecho, svg no es un archivo de imagen per se, está basado en xml, por lo que es, esencialmente, un archivo de texto sin formato.
En Linux, puede usar python-magic ( http://pypi.python.org/pypi/python-magic/0.1 ) que usa libmagic para identificar formatos de archivo.
AFAIK, libmagic examina el archivo e intenta contarle más sobre él que solo el formato, como las dimensiones del mapa de bits, la versión de formato, etc. Así que puede ver esto como una prueba superficial de "validez".
Para otras definiciones de "válido", es posible que deba escribir sus propias pruebas.
Muchas veces, el primer par de caracteres será un número mágico para varios formatos de archivo. Puede verificar esto además de su comprobación de excepción anterior.
Podrías usar los enlaces de Python a libmagic, python-magic y luego verificar los tipos de mime. Esto no le dirá si los archivos están corruptos o intactos, pero debería poder determinar qué tipo de imagen es.