Aktualisieren
Ich habe auch die folgende Lösung in meinem Python-Skript hier auf GitHub implementiert .
Ich habe auch überprüft, dass beschädigte Dateien (JPG) häufig keine "kaputten" Bilder sind, dh eine beschädigte Bilddatei bleibt manchmal eine legitime Bilddatei, das Originalbild geht verloren oder wird geändert, aber Sie können es trotzdem ohne Fehler laden. Das Abschneiden von Dateien verursacht jedoch immer Fehler.
Update beenden
Sie können das PIL-Modul ( Python Pillow ) mit den meisten Bildformaten verwenden, um zu überprüfen, ob eine Datei eine gültige und intakte Bilddatei ist.
Für den Fall, dass Sie auch fehlerhafte Bilder erkennen möchten, schlägt @Nadia Alramli die im.verify()
Methode korrekt vor , erkennt jedoch nicht alle möglichen Bildfehler , z. B. im.verify
erkennt keine abgeschnittenen Bilder (die die meisten Betrachter häufig mit einem grauen Bereich laden).
Pillow kann auch diese Art von Fehlern erkennen, aber Sie müssen eine Bildmanipulation oder eine Bilddecodierung / -rekodierung anwenden oder die Prüfung auslösen. Schließlich schlage ich vor, diesen Code zu verwenden:
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
Bei Bildfehlern löst dieser Code eine Ausnahme aus. Bitte beachten Sie, dass im.verify etwa 100-mal schneller ist als die Bildmanipulation (und ich denke, dass Flip eine der billigeren Transformationen ist). Mit diesem Code überprüfen Sie eine Reihe von Bildern mit etwa 10 MByte / s mit Standardkissen oder 40 MByte / s mit Pillow-SIMD-Modul (moderne 2,5-GHz-x86_64-CPU).
Für die anderen Formate psd , xcf , .. können Sie Imagemagick Wrapper Wand verwenden . Der Code lautet wie folgt:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Aber aus meinen Experimenten erkennt Wand keine abgeschnittenen Bilder, ich denke, er lädt fehlende Teile als grauer Bereich ohne Aufforderung.
I rot , dass ImageMagick hat einen externen Befehl erkennen , dass könnte den Job machen, aber ich habe keinen Weg zum Aufrufen dieser Funktion programmatisch und ich habe nicht getestet , diesen Weg gefunden.
Ich schlage vor, immer eine vorläufige Überprüfung durchzuführen und zu überprüfen, ob die Dateigröße nicht Null (oder sehr klein) ist. Dies ist eine sehr billige Idee:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case