Ich benutze derzeit PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
Obwohl dies die meisten Fälle ausreichend abdeckt, werden einige Bilddateien wie xcf, svg und psd nicht erkannt. Psd-Dateien lösen eine OverflowError-Ausnahme aus.
Gibt es eine Möglichkeit, sie auch einzubeziehen?
python
image
identification
imghdr
Sujoy
quelle
quelle
Antworten:
Oft sind die ersten paar Zeichen eine magische Zahl für verschiedene Dateiformate. Sie können dies zusätzlich zu Ihrer oben genannten Ausnahmeprüfung überprüfen.
quelle
Ich habe gerade das eingebaute imghdr- Modul gefunden. Aus der Python-Dokumentation:
So funktioniert es:
Die Verwendung eines Moduls ist viel besser als die Implementierung ähnlicher Funktionen
quelle
imghdr.what(path)
Gibt zurück,None
wenn der angegebenepath
Bilddateityp nicht erkannt wird. Liste der aktuell erkannten Bildtypen: rgb , gif , pbm , pgm , ppm , tiff , rast , xbm , jpeg , bmp , png , webp , exr .Zusätzlich zu den Vorschlägen von Brian können Sie die Überprüfungsmethode von PIL verwenden, um zu überprüfen, ob die Datei beschädigt ist.
quelle
Zusätzlich zur
PIL
Bildprüfung können Sie auch die Prüfung der Dateinamenerweiterung wie folgt hinzufügen:Beachten Sie, dass hierdurch nur geprüft wird, ob der Dateiname eine gültige Bilderweiterung hat. Das Bild wird nicht geöffnet, um festzustellen, ob es sich um ein gültiges Bild handelt. Aus diesem Grund müssen Sie zusätzlich
PIL
oder eine der in den anderen Antworten vorgeschlagenen Bibliotheken verwenden.quelle
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:
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:
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:
quelle
Unter Linux können Sie Python-Magic ( http://pypi.python.org/pypi/python-magic/0.1 ) verwenden, das libmagic zum Identifizieren von Dateiformaten verwendet.
AFAIK, libmagic schaut in die Datei und versucht, Ihnen mehr darüber zu erzählen als nur das Format, wie Bitmap-Dimensionen, Formatversion usw. Sie könnten dies also als oberflächlichen Test für "Gültigkeit" ansehen.
Für andere Definitionen von "gültig" müssen Sie möglicherweise Ihre eigenen Tests schreiben.
quelle
Sie können die Python-Bindungen für libmagic, python-magic verwenden und dann die MIME - Typen überprüfen. Dies sagt Ihnen nicht, ob die Dateien beschädigt oder intakt sind, aber es sollte in der Lage sein zu bestimmen, um welche Art von Bild es sich handelt.
quelle
Nun, ich weiß nichts über die Innenseiten von psd, aber ich weiß sicher, dass svg tatsächlich keine Bilddatei an sich ist - es basiert auf xml, also ist es im Wesentlichen a Nur-Text-Datei.
quelle
Eine Möglichkeit besteht darin, das
filetype
Paket zu verwenden.Installation
python -m pip install filetype
Vorteile
Lösungsbeispiel
Zusätzliche Informationen zum offiziellen Repo: https://github.com/h2non/filetype.py
quelle
Wäre es akzeptabel, die Dateierweiterungen zu überprüfen, oder versuchen Sie zu bestätigen, dass die Daten selbst eine Bilddatei darstellen?
Wenn Sie die Dateierweiterung überprüfen können, kann ein regulärer Ausdruck oder ein einfacher Vergleich die Anforderung erfüllen.
quelle
quelle