Bild via http öffnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Ok, folgendes Problem: ich würde gern ein Bild aus dem Internet holen und dieses dann anschließend verarbeiten, das Problem ist allerdings, dass das Bild keinerlei Endung hat, also:

www.domain.de/bild

anstatt z. B.:

www.domain.de/bild.jpeg

Dass das Bild ohne Endung dennoch ein Bild ist, erkennt ein normaler Browser anhand des Headers Content-type, was aber der Interpreter nicht macht... was ich probiert habe sind:

Code: Alles auswählen

from Image import *
from urllib2 import *
from cStringIO import *

imgurl=urlopen(filename)
img=StringIO(imgurl.read())
im=open(img)
und ohne StringIO sowie mit urlretrieval, alle Möglichkeiten funktionieren aber bei solchen Bildern nicht...
BlackJack

Könntest Du das mit den Sternchen-Importen bitte lassen!? Ich hätte so aus dem Kopf jedenfalls nicht 100%ig ausschliessen können, dass weder `urllib2` noch `cStringIO` den Namen `open` enthalten.

Was der Browser kann, kannst Du auch:

Code: Alles auswählen

In [54]: f = urllib2.urlopen('http://www.python-forum.de/')

In [55]: f.headers['content-type']
Out[55]: 'text/html'
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

BlackJack hat geschrieben:Könntest Du das mit den Sternchen-Importen bitte lassen!? Ich hätte so aus dem Kopf jedenfalls nicht 100%ig ausschliessen können, dass weder `urllib2` noch `cStringIO` den Namen `open` enthalten.

Was der Browser kann, kannst Du auch:

Code: Alles auswählen

In [54]: f = urllib2.urlopen('http://www.python-forum.de/')

In [55]: f.headers['content-type']
Out[55]: 'text/html'
open gibts bei Image (PIL), ist doch bequemer, die Modulnamen nicht einzutippen ;-)
BlackJack

Ich weiss dass es `open` im `PIL.Image`-Modul gibt. Du weisst auch was passiert wenn es den Namen auch in einem der anderen Module gegeben hätte!?

Das mag bequemer sein, ist aber eine Quelle für Fehler und macht Quelltexte unübersichtlich.
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Habe ich mal probiert, bekomme aber diese Fehlermeldung:

AttributeError: 'NoneType' object has no attribute 'items'

Code: Alles auswählen

header={"User-agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
                "content-type":"image/jpeg"}
req=Request(self.filename,None,header)
imgurl=urlopen(req)
print imgurl.read()
BlackJack

Glaube ich nicht. Ich bekomme die jedenfalls nicht. Es wäre nett wenn Du minimalen Quelltext zeigen könntest, den man direkt nachvollziehen kann.

Code: Alles auswählen

In [72]: header={"User-agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
                 "content-type":"image/jpeg"}

In [74]: req = urllib2.Request('http://www.python-forum.de', None, header)

In [75]: imgurl = urllib2.urlopen(req)

In [76]: data = imgurl.read()
Wobei es recht sinnfrei ist dem Server gegenüber zu behaupten die *Anfrage* würde ein JPEG enthalten.
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Danke, das Problem habe ich jetzt gelöscht, habe irgendwie irgendwo was sinnloses eingefügt...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wäre es nicht sinnvoll das dann hier zu posten? ;)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

"Content-Type" sendet der Server, der Client dagegen afaik nur einen "Accept"-Header.

Und schicke doch bitte keine User-Agent-Strings von Uralt-Browsern. Wenn das einer auswertet, müssen die Webentwickler diesen Steinzeit-Schrott (speziell alte IE-Versionen) möglicherweise auf Anweisung vom Chef noch supporten - und diese Qual sollte man auch seinen schlimmsten Feinden ersparen.
lunar

Y0Gi hat geschrieben:"Content-Type" sendet der Server, der Client dagegen afaik nur einen "Accept"-Header.
und diese Qual sollte man auch seinen schlimmsten Feinden ersparen.
Mmmmh... ich kenne Menschen, für die ist selbst das noch nicht schlimm genug.

Zum Problem:

Ich glaube schlicht nicht, dass die im ersten Posting gezeigte Lösung nicht funktioniert. PIL ist nämlich durchaus in der Lage, das Format eines Bildes (zumindest das einer JPEG-Datei) anhand des File-Headers zu erkennen! Ich habe das ganze mit einer lokalen Datei ohne Erweiterung nachvollzogen, dabei hat PIL das Format des Bildes eindeutig identifiziert:

Code: Alles auswählen

[lunar@nargond] - [19:29:46] >> ~/Bilder
--> cp Felsengeier.jpg Felsengeier

[lunar@nargond] - [19:29:53] >> ~/Bilder
--> lbg-ipython

[lunar@nargond]-[19:29:57] >> /home/lunar/Bilder
[1]--> import Image

[lunar@nargond]-[19:30:03] >> /home/lunar/Bilder
[2]--> from cStringIO import StringIO

[lunar@nargond]-[19:30:11] >> /home/lunar/Bilder
[3]--> Image.open(StringIO(open('Felsengeier').read()))
Out[3]: <JpegImagePlugin.JpegImageFile instance at 0x827066c>

[lunar@nargond]-[19:30:30] >> /home/lunar/Bilder
[4]--> _3.format
Out[4]: 'JPEG'
Antworten