Grafik an Browser ausgeben/"streamen"

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
DaRe
User
Beiträge: 2
Registriert: Dienstag 25. August 2009, 21:21
Kontaktdaten:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
Das Leben ist wie ein Tennisball.
DaRe
User
Beiträge: 2
Registriert: Dienstag 25. August 2009, 21:21
Kontaktdaten:

Hmm, na gut... dachte da müssen 2 newlines angegeben werden, wäre ich nicht drauf gekommen.
:oops:

Danke nochmal.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten