Seite 1 von 1

Bild via http öffnen

Verfasst: Dienstag 8. Januar 2008, 14:46
von pythonguy
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...

Verfasst: Dienstag 8. Januar 2008, 15:07
von 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'

Verfasst: Dienstag 8. Januar 2008, 15:28
von pythonguy
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 ;-)

Verfasst: Dienstag 8. Januar 2008, 15:30
von 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.

Verfasst: Dienstag 8. Januar 2008, 15:32
von pythonguy
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()

Verfasst: Dienstag 8. Januar 2008, 15:53
von 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.

Verfasst: Dienstag 8. Januar 2008, 16:02
von pythonguy
Danke, das Problem habe ich jetzt gelöscht, habe irgendwie irgendwo was sinnloses eingefügt...

Verfasst: Dienstag 8. Januar 2008, 19:21
von Hyperion
Wäre es nicht sinnvoll das dann hier zu posten? ;)

Verfasst: Mittwoch 9. Januar 2008, 11:16
von Y0Gi
"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.

Verfasst: Donnerstag 10. Januar 2008, 19:31
von 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'