Bilder via HTTP

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Bilder via HTTP

BeitragSo, März 30, 2008 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe nochmal eine frage, wie kann man normale BMP dateien von einem webserver downloaden, weil in meinem spiel das ich grade programmiere, was nur online funktioniert, möchte ich vieleicht auch mal so events machen, nur das problem was ich daran seh ist das man immer einen neuen clienten downloaden muss, dieses möchte ich umgehen, in dem ich 1. mein spiel progg, 2. den server ( die 2 sachen sind auch schon weit entwickelt und funktionieren ) und 3. ein programm worin hinterlegt ist welche bilder benötig werden und welche nicht,

wenn programm 3. nun sagt wir brauchen ostereier.BMP dann soll dieses am server übermittelt werden, was einfach zu machen ist, und der server übermittelt es nun an den clients, die clients laden sich dann automatisch das bild, dann wirds eine dazugehörige PHP datei geben in der "ein script" steht ob das bild nun ne animation ist oder einfach ein bild, wenn animation wieviele frames ect. wenn die clients das ganze dann haben wird das automatisch im game angezeigt werden.

ich finde es ist eine schöne vorstellung und realisierbar, nur muss ich wissen wie man ein bild downloaden kann via http.

danke im vorraus, ich freu mich auch schon darauf das spiel mal präsentieren zu dürfen. es wird bald dann ein testserver geben, wo das game 21 tage drauf laufen wird, damit ich dann erfahren kann wie es ankommt ect.

d-bug

BeitragSo, März 30, 2008 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
LoadImage ("http://www.deinserver.de/ostereier.bmp")


cheers

FOODy

BeitragSo, März 30, 2008 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
d-bug hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
LoadImage ("http://www.deinserver.de/ostereier.bmp")


cheers


Fast: ( Anstelle von "://" muss ein "::" hin )
Code: [AUSKLAPPEN]
LoadImage ("http::www.deinserver.de/ostereier.bmp")


Falls du ein Framework verwendest brauchst du noch zusätzlich das BRL.HTTPStream Module.

Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

d-bug

BeitragSo, März 30, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh stimmt... Verdammter Automatismus Very Happy

Mathias-Kwiatkowski

BeitragMo, März 31, 2008 7:49
Antworten mit Zitat
Benutzer-Profile anzeigen
wird das bild dann direct vom server aus geladen, oder wird es local gespeichert?
 

c64

BeitragMo, März 31, 2008 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist nur ne Behauptung aber ich bin mir ziemlich sicher das es vom "Server" aus in den Speicher geladen wird ohne "Zwischenlagerung". Ist fast wie von einer Localen platte laden nur das die Location (URL) woanders ist.

mfg.
c64
Betreten verboten! Kinder haften für ihre Eltern!

Mathias-Kwiatkowski

BeitragMo, März 31, 2008 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
tut mir leid aber habe nun folgenden code

Code: [AUSKLAPPEN]
Graphics 1024, 768


Char000:TImage = LoadImage ("http::www.purechannel.ath.cx/000.bmp")


Repeat
   DrawImage char000, 20, 20
   
   Flip
Until KeyDown(KEY_ESCAPE)
End


ich habe www. weggelassen und es funktioniert nicht, genauso wie mit www. der will einfach nicht

genauso wie Localhost, funktioniert leider auch nicht. aber das bild is da , wenn man es mit browser öfnnen will funktioniert es. thx im vorraus

FOODy

BeitragMo, März 31, 2008 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Liegt wohl daran das der BMP Loader einen "Seek-baren" Stream benötigt.

So geht es:
Code: [AUSKLAPPEN]
SuperStrict
Framework brl.glmax2d
Import brl.bmploader
Import brl.httpstream
Import brl.bankstream

Graphics 1024, 768


Local char000:TImage = LoadImage(CreateBankStream(LoadBank("http::www.purechannel.ath.cx/000.bmp")))


Repeat
   DrawImage char000, 20, 20
   
   Flip
Until KeyDown(KEY_ESCAPE)
End




Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Jolinah

BeitragDi, Apr 01, 2008 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ansonsten kann man auch selber etwas schreiben Wink Das hab ich noch auf meiner Platte gefunden:

Code: [AUSKLAPPEN]
SuperStrict


Function LoadHttpImage:TImage(host:String, path:String, port:Int = 80)

   'SocketStream erstellen
   Local stream:TSocketStream = TSocketStream.CreateClient(host, port)

   'Wenn die Verbindung nicht hergestellt werden konnte, kein Bild zurück geben
   If stream.Eof() Then Return Null

   'HTTP Header senden
   WriteLine(stream, "GET " + path + " HTTP/1.1")
   WriteLine(stream, "Host: " + host)
   WriteLine(stream, "User-Agent: BlitzMax")
   WriteLine(stream, "Accept: image/*")
   WriteLine(stream, "Connection: close")
   WriteLine(stream, "")
   
   'Wenn nichts gelesen werden kann, kein Bild zurückgeben
   If stream.Eof() Then
      stream.Close()
      Return Null
   EndIf
   
   'Status abfragen (nur 200 OK) akzeptieren
   Local status:String = ReadLine(stream)
   If Not status.Contains("200") Then Return Null
   
   'Antwort-Header lesen
   Local size:Long = 0
   Local typ:String = ""
   
   Local line:String = ReadLine(stream)
   While (Not stream.Eof()) And (line <> "")

      If line.ToLower().StartsWith("content-length: ") Then
         'Grösse des Inhalts (Bild) lesen
         Local tmp:String[] = line.Split(": ")
         size = Long(tmp[1])
      Else If line.ToLower().StartsWith("content-type: ") Then
         'Typ des Inhalts lesen (sollte ein Bild sein)
         Local tmp:String[] = line.Split(": ")
         typ = tmp[1]
      EndIf

      line = ReadLine(stream)
   Wend
   
   'Abbrechen, wenn die Grösse 0 ist, oder wenn der Inhalt kein Bild ist,
   'oder wenn nichts gelesen werden kann
   If size = 0 Or (Not typ.ToLower().StartsWith("image/")) Or stream.Eof() Then
      stream.Close()
      Return Null
   EndIf
   
   'Bankstream erstellen
   Local bank:TBankStream = TBankStream.Create(TBank.Create(0))
   
   'Einen 4 KB Buffer verwenden
   Local buf:Byte[] = New Byte[4096]
   Local gelesen:Int = 0
   
   'Lesen vom Netzwerkstream in den Bankstream
   While Not stream.Eof() And gelesen < size
      Local i:Int = stream.Read(buf, 4096)
      If i > 0 Then
         bank.Write(buf, i)
         gelesen :+ i
      Else
         'Unvollständig gelesen, oder Verbindungsunterbruch
         Return Null
      EndIf
   Wend
   stream.Close()

   'Das Bild vom Bankstream laden
   SeekStream(bank, 0)
   Local img:TImage = LoadImage(bank)
   
   buf = Null
   bank.Close()
   bank = Null
   
   Return img
   
End Function


Graphics 800, 600, 0

Local img:TImage = LoadHttpImage("www.20min.ch", "/images/logo3.jpg")

Repeat
Cls

   DrawImage img, 50, 50

Flip
Until KeyHit(KEY_ESCAPE)

EndGraphics
End


Es ist jedoch nicht so zuverlässig, da HTTP-Umleitungen etc. nicht beachtet werden. Das Bild wird nur geladen wenn der HTTP-Status 200 (OK) ist.

Mathias-Kwiatkowski

BeitragFr, Apr 04, 2008 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh,. ja der lädt das bild zwar, aber nur im arbeitsspeicher, nur jetzt is es ja so das der soll das bild laden, und local speichern.

also in mein prog soll ein durchlauf sein if bild="lol.bmp" im ordner gfx then ok ansonsten lade das bild runter und es soll dann local geladen werden, da man ja sonst immer warten muss bis 100% alles heruntergeladen ist.


weiss jemand ein rat?
 

ChristianK

BeitragFr, Apr 04, 2008 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast doch den Stream / die Bank, wenn du die Datei geladen hast.
Dann musst du den Stream / Bank nur noch auf der Festplatte speichern. Entweder mit WriteStream oder SaveBank.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Jolinah

BeitragFr, Apr 04, 2008 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, dann hab ich dich falsch verstanden. Dachte du wolltest es nur im Arbeitsspeicher laden. Vielleicht ist dann das hier das richtige für dich:

https://www.blitzforum.de/foru...hp?t=24120

Schau dir da mal example1.bmx an. Dort wird das Bild heruntergeladen und auf der Festplatte gespeichert. Diese Klassen berücksichtigen sogar einfache Weiterleitungen, und machen einen neuen HTTP-Request.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group