Comment vérifier si un fichier est un fichier image valide?
-
23-08-2019 - |
Question
Je suis actuellement en utilisant PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
Cependant, alors que cela couvre suffisamment la plupart des cas, certains fichiers d'image comme, xcf, svg et Psd ne sont pas détectés. fichiers Psd renvoie une exception OverflowError.
Y at-il someway je pourrais aussi les inclure?
La solution
Beaucoup de fois les premiers caractères de couple sera un nombre magique pour différents formats de fichiers. Vous pouvez vérifier cela en plus de votre exception de vérification ci-dessus.
Autres conseils
Je viens de trouver le imghdr module. De la documentation python:
Le module détermine le type imghdr de l'image contenue dans un fichier ou un octet courant.
Voilà comment cela fonctionne:
>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'
L'utilisation d'un module est beaucoup mieux que réimplémentant fonctionnalités similaires
En plus de ce que Brian suggère que vous pouvez utiliser le vérifier procédé pour vérifier si le fichier est cassé.
im.verify ()
Les tentatives pour déterminer si le fichier est cassé, sans décoder en fait la des données d'image. Si cette méthode trouve tout problèmes, il soulève approprié exceptions. Cette méthode ne fonctionne que sur une image nouvellement ouverte; si l'image a déjà été chargé, le résultat est indéfini. De plus, si vous devez charger l'image après avoir utilisé cette méthode, vous doit rouvrir le fichier image. Attributs
Sur Linux, vous pouvez utiliser la magie python ( http: //pypi.python .org / pypi / python-magic / 0,1 ) qui utilise libmagic pour identifier les formats de fichier.
AFAIK, libmagic regarde dans le fichier et tente de vous en dire plus que juste le format, comme les dimensions bitmap, version du format etc .. Vous pouvez donc voir cela comme un test superficiel pour « validité ».
Pour d'autres définitions de « valides » que vous pourriez avoir à écrire vos propres tests.
Eh bien, je ne sais pas sur les faces intérieures des dsp, mais je, vous, sachez que, en effet, svg est pas un fichier d'image en soi, - il est basé sur XML, il est donc, essentiellement, un fichier texte brut.
Mise à jour
J'ai aussi mis en œuvre la solution suivante dans mon script Python ici GitHub.
J'ai aussi vérifié que les fichiers endommagés (jpg) ne sont souvent pas des images cassé-à-dire, un fichier image endommagé reste parfois un fichier image legit, l'image originale est perdue ou modifié, mais vous êtes toujours en mesure de le charger sans erreur . Mais, troncature de fichier provoque toujours des erreurs.
Fin de mise à jour
Vous pouvez utiliser Python Pillow module (PIL), avec la plupart des formats d'image, pour vérifier si un fichier est un fichier image valide et intact.
Dans le cas où vous visez à détecter aussi des images brisées, @Nadia Alramli suggère correctement la méthode im.verify()
, mais ne détecte pas tous les défauts d'image possibles , par exemple, im.verify
ne détecte pas les images tronquées ( que la plupart des téléspectateurs chargent souvent avec une zone grisés).
Pillow est capable de détecter ce type de défauts aussi, mais vous devez appliquer la manipulation d'image ou de l'image decode / recodage ou pour déclencher le contrôle. Enfin, je suggère d'utiliser ce code:
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 cas de défauts d'image ce code déclenche une exception. S'il vous plaît considérer que im.verify est d'environ 100 fois plus rapide que d'effectuer la manipulation d'images (et je pense que la médaille est l'une des transformations moins chères). Avec ce code, vous allez vérifier un ensemble d'images à environ 10 Mo / s avec oreiller standard ou 40 Mo / s avec le module plateau-coussin SIMD (2.5Ghz CPU moderne x86_64).
Pour les autres formats dsp , xcf , .. vous pouvez utiliser Imagemagick wrapper Baguette , le code est comme suit:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Mais, de mes expériences Wand ne détecte pas les images tronquées, je pense qu'il manque des pièces charge comme zone grisés sans demander.
I rouge que Imagemagick a une commande externe identifier que pourrait faire le travail, mais je ne l'ai pas trouvé un moyen d'invoquer cette fonction programme et je ne l'ai pas testé cette voie.
Je suggère d'effectuer toujours un contrôle préliminaire, vérifiez la taille du fichier pour ne pas être zéro (ou très faible), est un très pas cher idée :
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
Would vérifier les extensions de fichier soient acceptables ou que vous essayez de confirmer les données lui-même représente un fichier d'image?
Si vous pouvez vérifier l'extension de fichier une expression régulière ou une simple comparaison pourrait satisfaire à l'exigence.
De plus à l'image de PIL
vérifier que vous pouvez également ajouter l'enregistrement d'extension de nom de fichier comme ceci:
filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
Notez que cela ne vérifie si le nom de fichier a une extension d'image valide, il ne s'ouvre pas vraiment l'image pour voir si elle est une image valide, c'est la raison pour laquelle vous avez besoin d'utiliser en plus PIL
ou l'une des bibliothèques proposées dans l'autre réponses.