Mettre à jour
J'ai également implémenté la solution suivante dans mon script Python ici sur GitHub .
J'ai également vérifié que les fichiers endommagés (jpg) ne sont souvent pas des images «cassées», c'est-à-dire qu'un fichier image endommagé reste parfois un fichier image légitime, l'image d'origine est perdue ou modifiée mais vous pouvez toujours la charger sans erreur. Mais, la troncature de fichier provoque toujours des erreurs.
Mettre fin à la mise à jour
Vous pouvez utiliser le module Python Pillow (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 souhaitez détecter des images également cassées, @Nadia Alramli suggère correctement la im.verify()
méthode, mais cela 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ée).
Pillow est également capable de détecter ce type de défauts, mais vous devez appliquer une manipulation d'image ou un décodage / recodage d'image ou déclencher la vérification. 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 lèvera une exception. Veuillez noter que im.verify est environ 100 fois plus rapide que la manipulation d'image (et je pense que le retournement est l'une des transformations les moins chères). Avec ce code, vous allez vérifier un ensemble d'images à environ 10 Mo / s avec Pillow standard ou 40 Mo / s avec le module Pillow-SIMD (processeur 2.5Ghz x86_64 moderne).
Pour les autres formats psd , xcf , .. vous pouvez utiliser le wrapper Wand Imagemagick , le code est le suivant:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Mais, d'après mes expériences, Wand ne détecte pas les images tronquées, je pense qu'il charge les parties manquantes sous forme de zone grisée sans invite.
Je rouge qu'Imagemagick a une identification de commande externe qui pourrait faire le travail, mais je n'ai pas trouvé de moyen d'invoquer cette fonction par programme et je n'ai pas testé cette route.
Je suggère de toujours effectuer une vérification préliminaire, de vérifier que la taille du fichier n'est pas nulle (ou très petite), c'est une idée très bon marché :
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case