Seite 1 von 1

Testen ob Datei wirklich ein Bild ist

Verfasst: Donnerstag 5. Juli 2012, 19:19
von microkernel
Moin :)
Ich tüftel gerade an einem Programm welche u.a. automatisch Bilder aus dem Web runterlädt (ist alles legal). Allerdings würde ich gerne prüfen, ob die Datei, welche gerade runtergeladen wurde, auch wirklich ein Bild ist. Zur Zeit läuft das Programm so, dass nur Dateien mit einer JPG oder PNG Endung heruntergeladen werden. Mittels mimetypes überprüfe ich, ob die Datei eine Korrekte Endung hat. Allerdings wird anschließend nicht geprüft ob die Datei mit der JPG/PNG Endung auch wirklich ein Bild ist.
Wie kann ich das nun Prüfen? Ich hab mir gedacht, dass ich einfach das Bild mittels PIL öffnen könnte, und schauen könnte, ob PIL mir einen Fehler aufwirft. Aber ist das sicher?

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Donnerstag 5. Juli 2012, 19:51
von darktrym
Unix kennt file.

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Donnerstag 5. Juli 2012, 20:10
von BlackJack
@darktrym: Ja aber eben nur Unix. Und unsicherer als tatsächlich zu versuchen die Bilddateien zu dekomprimieren ist es auch, denn ``file`` testet nur eine handvoll Bytes.

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Donnerstag 5. Juli 2012, 22:01
von darktrym
PIL ist aber weit davon entfernt alle relevanten Formate zu unterstützen, noch dazu crasht das gerne mal wenn ihm etwas nicht koscher vorkommt. Oft genug bei unvollständ. Dateien oder JPEG2000 gesehen.
Aber besser als nur die ersten paar Bytes zu lesen wie es file tut, wenn es auch nicht die performanteste und zuverlässigste Möglichkeit ist. File gibt natürlich auch für andere Plattformen.

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Freitag 6. Juli 2012, 02:54
von Leonidas
Aber man will doch gerade testen ob es ein Bild ist, da ist der zusätzliche Check "kann man es laden" nen Vorteil gegenüber "Hat es nen PNG-Header" weil letzteres auch ein korruptes, halb heruntergeladenes Bild sein kann.

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Freitag 6. Juli 2012, 19:56
von microkernel
Naja ich hab's jetzt folgendermaßen gelöst (Auszug aus meiner Klasse):

Code: Alles auswählen

    def is_valid(self):
        if self.mimetype not in self.accepted_mimetypes:
            return False
        try:
            image = Image.open(StringIO(self.binary))
            image.verify()
        except IOError:
            return False
        return True
...nur für den Fall, dass ein anderer mal danach sucht.

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Samstag 7. Juli 2012, 23:57
von ocoal
Hallo auch,

prinzipiell ein gar nicht mal so schlechter Ansatz ... aus Performancegründen würde ich Dir jedoch die Ermittlung des Bildtyps über die Validierung des Dateiheaders empfehlen.

Im Netz findet man diesbezüglich ja wahnsinnig viele Infos. Falls es Dir interessiert: http://www.fastgraph.com/help/image_fil ... rmats.html

Aber warum das Rad neu erfinden, wenn bereits andere sich der Aufgabe gewidmet haben. So findest Du im Python Package Index bereits eine Bilbliothek, die das für dich erledigen kann: ImageLite

-Colin-

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Sonntag 8. Juli 2012, 00:33
von lunar

Re: Testen ob Datei wirklich ein Bild ist

Verfasst: Sonntag 8. Juli 2012, 06:48
von ocoal
Ganz im Gegenteil :) ... ich wusste nicht einmal von diesem Modul und muss sagen, es funktioniert perfekt und unterstützt zudem eine ganze Reihe mehr an Bild-Formaten hinsichtlich der Erkennung.

-Colin-