Seite 1 von 1

Grafik an Browser ausgeben/"streamen"

Verfasst: Sonntag 30. August 2009, 22:50
von DaRe
Guten Abend,
leider komm ich nun mit dem "Python" Openbook nicht mehr weiter.

Soweit mir bekannt war gab es die Möglichkeit in PHP eine Grafik direkt an den Browser zu "streamen". Gibt es eine ähnliche Möglichkeit unter Python?
Bisher bin ich mit Hilfe von http://www.pythonware.com/library/pil/h ... /image.htm auf folgendes gekommen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import Image

im=Image.open("grafik.png")
print "Content-type: image/png\n\n"
print im.getdata
Allerdings liefert dies nur die Sequenz.

Mit meinem Versuch die Grafik im Binärmodus auszulesen hatte ich auch Schwierigkeiten:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os

picture=open("grafik.png", "rb")
print "Content-type: image/png\n\n"
print picture.read()
picture.close()
Könnte mich eine dieser beiden Herangehensweisen ans Ziel bringen? Oder gibt es eine bessere Möglichkeit?

Vielen Dank schon mal im Voraus.

Verfasst: Sonntag 30. August 2009, 23:36
von EyDu
Hallo.

Das zweite Stück Code sollte funktionieren, wenn du das zweite Newline weglässt. Durch "print" wird nämlich noch eins an die Ausgabe angehängt. Mit der Suchfunktion und "cgi image" hättest du das aber auch alleine rausgefunden ;-)

Hmm...

Verfasst: Montag 31. August 2009, 09:15
von DaRe
Hmm, na gut... dachte da müssen 2 newlines angegeben werden, wäre ich nicht drauf gekommen.
:oops:

Danke nochmal.

Verfasst: Mittwoch 2. September 2009, 09:25
von sma
Der HTTP-Standard erfordert (eigentlich), dass \r\n als Zeilentrenner benutzt wird. Außerdem darfst du natürlich kein \n hinter den Grafikdaten haben, so wie das `print` jetzt erzeugt. Daher:

Code: Alles auswählen

import sys

sys.stdout.write("Content-type: image/png\r\n\r\n")
with open("grafik.png") as f:
    sys.stdout.write(r.read())
Eigentlich müsste das `open` ein "rb" als zweites Argument haben, aber das `stdout.write` auch nicht garantiert, dass es binär ist, funktioniert das so oder so nur unter Unix richtig.

Ist die Grafik so richtig groß, willst du sie wahrscheinlich nicht in einem lesen und schreiben, sondern in handlichen Blöcken a 8k oder so.

Stefan