2009-05-20 11 views
60

Ich verwende derzeit PIL.Wie überprüft man, ob eine Datei eine gültige Image-Datei ist?

from PIL import Image 
try: 
    im=Image.open(filename) 
    # do stuff 
except IOError: 
    # filename not an image file 

Doch während dies ausreichend meisten Fällen deckt, einige Bilddateien wie, xcf, svg und psd nicht entdeckt zu werden. Psd-Dateien löst eine OverflowError-Ausnahme aus.

Gibt es eine Möglichkeit, die ich auch aufnehmen könnte?

+19

Es ist nicht besonders gängige Praxis Duplikate in verschiedenen Sprachen zu schließen. Wenn Sie keine anderen Python-Fragen finden können, lassen Sie es offen, da es Python-spezifische Lösungen geben könnte, die die Leute veröffentlichen möchten, die es nicht zu der von Ihnen geposteten Frage geschafft haben. –

+0

Ja, zuerst hatte ich wirklich auf eine Python-Lib gehofft, die ich nicht kannte: P und dann, wie ben aufgezeigt wurde, validieren nur die magischen Zahlen nicht das gesamte Bild. – Sujoy

+0

@Sujoy, ein ganzes Bild zu validieren ist fast unmöglich, es sei denn, Sie haben bereits eine Kopie davon, weil der Computer nicht den Unterschied zwischen einem richtigen Farbpixel und einem verstümmelten Satz von 1s und 0s erkennen kann, solange alle Kontrolle (magische Zahlen) sind korrekt. – DevinB

Antwort

8

Viele Male die ersten paar Zeichen wird eine magische Zahl für verschiedene Dateiformate sein. Sie können dies zusätzlich zu Ihrer oben genannten Ausnahmeprüfung prüfen.

+4

Das wird nicht ausreichen, wenn er wirklich nach "gültigen" Bildern sucht; Das Vorhandensein einer magischen Zahl garantiert nicht, dass die Datei beispielsweise nicht abgeschnitten wurde. –

+0

ausgezeichneter Rat, jetzt muss ich nur herausfinden, was diese Zahlen sind. Danke :) – Sujoy

+0

@ben, autsch ich dachte noch nicht daran. das ist ein guter Punkt in der Tat – Sujoy

1

Would Überprüfung der Dateierweiterungen akzeptabel sein oder versuchen Sie, die Daten selbst stellt eine Bilddatei zu bestätigen?

Wenn Sie überprüfen die Dateierweiterung einen regulären Ausdruck oder ein einfacher Vergleich könnte die Anforderung erfüllen.

+0

einfach Überprüfung Erweiterung wird nicht ausreichen, wie man eine TXT-Datei als jpg oder etwas umbenennen kann. Ich denke, wenn ich keine Lösung finden kann, nur dann werde ich Extension-Überprüfung für xcf und svg verwenden. – Sujoy

+0

Verständlich, ich hatte nur auf einige Erläuterungen gehofft, bevor ich eine Lösung entwickelt, die besser Ihren Bedürfnissen entsprechen könnte. Vielen Dank! – doomspork

2

Nun, ich weiß nicht über die Innenseiten von PSD, aber ich weiß, dass Svg tatsächlich keine Bilddatei per se ist, - es basiert auf XML, so ist es Im Wesentlichen eine einfache Textdatei.

+0

Aha, du hast Recht. Es ist XML. Es enthält jedoch einige Bilddaten darin eingebettet. – Sujoy

2

Unter Linux können Sie python-magic (http://pypi.python.org/pypi/python-magic/0.1) verwenden, die Dateiformate zu identifizieren libmagic verwendet.

AFAIK, libmagic schaut in die Datei und versucht, Ihnen mehr als nur das Format, wie Bitmap-Dimensionen, Formatversion usw. zu erzählen. Sie könnten dies als oberflächlichen Test für "Gültigkeit" sehen.

Für andere Definitionen von „gültig“ Sie müssen möglicherweise Ihre eigenen Tests schreiben.

28

Zusätzlich zu dem, was Brian vorschlägt, könnten Sie PIL verify Methode verwenden, um zu überprüfen, ob die Datei beschädigt ist.

im.verify()

Versuche, zu bestimmen, ob die Datei gebrochen ist, ohne tatsächlich die Decodierung der Bilddaten . Wenn diese Methode Probleme findet, löst es geeignete Ausnahmen aus. Diese Methode funktioniert nur bei einem neu geöffneten Image; Wenn das Bild bereits geladen wurde, ist das Ergebnis undefined. Wenn Sie nach der Verwendung dieser Methode das Bild laden müssen, müssen Sie die Bilddatei erneut öffnen . Attribute

+0

Nun das Hauptproblem ist, dass Svg, Xcf und Psd-Dateien nicht mit Image.open() geöffnet werden können, daher keine Chance der Überprüfung mit im.verify() – Sujoy

+11

Mein Gott die PIL-Dokumentation ist schrecklich. Was ist genau eine "geeignete Ausnahme"? – Timmmm

+0

Hier ist der Link zu der [Pillow-Dokumentation für Image.verify()] (https://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.verify). Leider ist es nicht besser, und es sieht so aus, als hätten sie den obigen Absatz einfach aufgehoben, ohne etwas hinzuzufügen. –

3

Sie könnten die Python-Bindungen zu libmagic, python-magic verwenden und überprüfen Sie dann die Mime-Typen. Dies sagt Ihnen nicht, ob die Dateien beschädigt oder intakt sind, aber es sollte in der Lage sein zu bestimmen, um welchen Typ von Bild es sich handelt.

134

Ich habe gefunden, nur das eingebaute imghdr Modul. Von Python-Dokumentation:

Das imghdr Modul bestimmt den Typ des Bildes in einer Datei oder einem Byte enthalten Stream.

Dies ist, wie es funktioniert:

>>> import imghdr 
>>> imghdr.what('/tmp/bass') 
'gif' 

ein Modul ist viel besser verwenden als vergleichbare Funktionalität Neuimplementierung

+1

ja imghdr funktioniert für die meisten Bildformate, aber nicht alle. wie mein ursprüngliches Problem mit SVG, XCF und PSD-Dateien, gut diese sind unentdeckt in img imdr sowie – Sujoy

+0

Ja, aber anstatt das Rad neu zu erfinden gibt es etwas zu beginnen. –

+0

Sie können beispielsweise unerkannte Bildköpfe ablehnen. Wenn das Bild nicht von imghdr erkannt wurde, wird es wahrscheinlich auch nicht von PIL unterstützt. Oder Sie können mit dem Quellcode imghr beginnen und sehen, wie es funktioniert. –

Verwandte Themen