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?

Était-ce utile?

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.

Vous pouvez utiliser les liaisons Python pour libmagic, python-magie et vérifier les types MIME. Cela ne vous dira pas si les fichiers sont corrompus ou intacts, mais il devrait être en mesure de déterminer quel type d'image, il est.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top