warum wurd das bild nicht gefunden?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: warum wurd das bild nicht gefunden?

BeitragDi, Feb 07, 2012 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Unhandled Exception:Attempt to access field or method of Null object


mein code:
Code: [AUSKLAPPEN]
Graphics 1024, 768

Global LoginScreen:TImage = LoadImage("HTTP::darkwars.da.funpic.de/Universe.jpg")



Repeat
   Cls
   DrawImage LoginScreen, 0, 0
   
   Flip
Until KeyDown(KEY_ESCAPE)
End


das bild gibt es zu 100%^^

http://darkwars.da.funpic.de/Universe.jpg

kann mir grad nicht wirklich helfen ^^
 

Lion

BeitragDi, Feb 07, 2012 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bezweifel ganz stark, dass du das Bild einfach so laden kannst.
Du musst ja erstmal das Bild überhaupt anfragen, mit einem normalen Stream.
Einfach so aus dem Internet ziehen geht wohl eher nicht, wie du ja selbst bemerkst.
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Mathias-Kwiatkowski

BeitragDi, Feb 07, 2012 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
doch kla geht das...

so habe ich auch schon oft bilder aus dem netz geladen... aber vll könnte es an funpic liegen.
aber das tut es nicht wirklich,

schau mal hier.

es ging mal / https://www.blitzforum.de/foru...highlight=

BtbN

BeitragDi, Feb 07, 2012 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib doch mal das http klein, damit auch mit dem vergleich im StreamHandler übereinstimmt.

Mathias-Kwiatkowski

BeitragDi, Feb 07, 2012 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
das geht leider genausowenig

und an funpic liegt es nicht

Code: [AUSKLAPPEN]
Global LoginScreen:TImage = LoadImage("http::www.new-dream.de/image/wallpaper/3d/3d-weltall/3d-weltall_52.jpg")


oder so:

Code: [AUSKLAPPEN]
Global LoginScreen:TImage = LoadImage("http::new-dream.de/image/wallpaper/3d/3d-weltall/3d-weltall_52.jpg")

Propellator

BeitragDi, Feb 07, 2012 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr, sehr seltsamer Bug, immerhin funktioniert dies tadellos:
BlitzMax: [AUSKLAPPEN]
http:THTTPStreamFactory = New THTTPStreamFactory
stream:TStream = http.CreateStream("http::darkwars.da.funpic.de/Universe.jpg", "http", "darkwars.da.funpic.de/Universe.jpg", 1, 0)
px:TPixmap = LoadPixmapJPeg( stream )
LoginScreen:TImage = LoadImage(px)

Repeat
Cls
DrawImage LoginScreen, 0, 0

Flip
Until KeyDown(KEY_ESCAPE)
End


Viel Spass beim Debuggen von Siblys Code. :/
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Mathias-Kwiatkowski

BeitragDi, Feb 07, 2012 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
da muss ich dich entteuschen, auch das geht leider nicht, und falls die frage kommt... blitzmax ist aktuell. und ja auch bezahlt ^^ xD

ZEVS

BeitragDi, Feb 07, 2012 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem kann daran liegen, dass brl.httpstream den Stream zurückgibt, bevor alle Daten da sind. Wohlmöglich erscheint es dem JPEG-Loader so, dass das Bild nicht vollständig ist, obwohl er nur warten müsste.
Am einfachsten finde ich den Umweg über Banks:
BlitzMax: [AUSKLAPPEN]
LoadImage(CreateBankStream(LoadBank("HTTP::darkwars.da.funpic.de/Universe.jpg")))


ZEVS

Propellator

BeitragDi, Feb 07, 2012 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@ZEVS: Glaube ich eher nicht. Übergebe ich den Stream an LoadPixmap (welches jeden Loader ausprobiert, und der Erste, der nicht eine Exception kotzt, hat gewonnen) erst nach einem Delay von 1000 Millisekunden übergebe, will er das ganze trotzdem nicht laden. Beachtenswert ist, dass LoadPixmapJPeg(stream) funktioniert, aber LoadPixmap(stream) nicht. Hui.

EDIT: Und ja, man kann Streams an LoadPixmap übergeben. ReadStream( stream ) liefert einen gültigen Stream mit gültigen Daten zurück.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Mathias-Kwiatkowski

BeitragDi, Feb 07, 2012 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
kann es sein das bmax (neuste version) einige bugs hingegen den alten hat?

Propellator

BeitragDi, Feb 07, 2012 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das einzige, was ich mir denken kann, ist, dass der Fehler irgendwo in pixmap.bmx liegt, genauer im Auswählen der Loader. LoadPixmapJPeg kommt mit dem ganzen klar, LoadPixmap aber nicht. Und alles was LoadPixmap macht ist den Loader auswählen.
Seltsam, seltsam. Muss ganz sicher ein BRL-Bug sein, nicht deine Schuld.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Mathias-Kwiatkowski

BeitragDi, Feb 07, 2012 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
na hoffe das dann da bald malnen update kommt womit des wieder gehen wird^^

SamFisher

BeitragMi, Feb 08, 2012 2:23
Antworten mit Zitat
Benutzer-Profile anzeigen
So funktioniert es. Graphics musste noch ausgeführt werden Smile

BlitzMax: [AUSKLAPPEN]

Graphics 800,600,0,2 '<<<<<<Graphics
http:THTTPStreamFactory = New THTTPStreamFactory
stream:TStream = http.CreateStream("http::darkwars.da.funpic.de/Universe.jpg", "http", "darkwars.da.funpic.de/Universe.jpg", 1, 0)
px:TPixmap = LoadPixmapJPeg( stream )
LoginScreen:TImage = LoadImage(px)

Repeat
Cls
DrawImage LoginScreen, 0, 0

Flip
Until KeyDown(KEY_ESCAPE)
End

Propellator

BeitragMi, Feb 08, 2012 3:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar funktioniert es so. Sagte ich ja auch. Aber im Prinzip muss LoadImage auch stream als Argument akzeptieren. Deshalb funktioniert LoadImage(diehttpurl) nicht. Graphics hat bei meinem Rumgeteste nie gefehlt, es ist effektiv ein Bug in LoadPixmap.
Der Grund wieso Graphics im oberen Code fehlte, war, dass ich anderes Zeugs darüber auskommentierte, und schlichtwegs Graphics nicht mit in den Post kopiert habe. Da ich ja aber schrieb, dass es folglich funktioniere, ist dies sowieso irrelephant.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

mpmxyz

BeitragMi, Feb 08, 2012 8:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt einen einfachen Grund für das Verhalten:
BlitzMax probiert jeden Pixmap-Loader aus und muss daher immer wieder mit der Leseposition zurückspringen.
Bei Socket-Streams gibt es diese Möglichkeit nicht. (Die HTTPStreamFactory ist dafür nur ein Comfort-Wrapper, der auf den "http::"-Vorsatz reagiert.)
Das ist der schuldige Code:
BlitzMax: [AUSKLAPPEN]
	Local pos=stream.Pos()
If pos=-1
stream.Close
Return
EndIf

Die Pixmap-Erstellung wird einfach abgebrochen. Man könnte den Code so modifizieren, dass er stattdessen einen gepufferten Streamwrapper nutzt, sodass die gelesenen Werte zwischengespeichert werden.
MfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Propellator

BeitragMi, Feb 08, 2012 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Tatsächlich. Der einfachste Workaround wäre wohl die Methode von ZEVS.

Ein möglicher Fix wäre es, den HTTP Stream als normalen gepufferten Stream anzusehen. Man könnte durch das content-length HTTP-header Feld einfach herausfinden, wie gross der Stream sein muss. Ich werde mal ein bisschen damit rumprobieren.

EDIT: Fixed! Anstatt BRL.HTTPStream zu Importieren einfach meinen Workaround ins Framework reinnehmen.

BlitzMax: [AUSKLAPPEN]

Strict

Module Elephant.HTTPStream

ModuleInfo "Version: 1.00"
ModuleInfo "Author: Propellator"
ModuleInfo "License: Public Domain"

ModuleInfo "History: 1.00 Release"

Import BRL.SocketStream
Import BRL.Bank
Import BRL.BankStream

Type THTTPStreamFactory Extends TStreamFactory

Method CreateStream:TStream( url:Object, Protocol:String, Path:String, Readable:Int, Writeable:Int )
If Protocol.ToLower() = "http"
Local SlashPos:Int
Local Host:String = Path
Local File:String = "/"

SlashPos = Path.Find( "/" )
If SlashPos > -1
Host = Path[..SlashPos]
File = Path[SlashPos..]
EndIf

Local HTTPStream:TStream = TSocketStream.CreateClient( Host, 80 )
If HTTPStream = Null Then Throw New TStreamReadException

' Send a request
HTTPStream.WriteLine( "GET " + File + " HTTP/1.0" )
HTTPStream.WriteLine( "Host: " + Host )
HTTPStream.WriteLine( "" )

Local Size:Int = -1

While Not Eof( HTTPStream )
Local Line:String = HTTPStream.ReadLine()

If Line = "" Then Exit

If Line.toLower().StartsWith( "content-length:" ) Then
Size = Int(Line[(Line.Find(": ") + 2)..])
EndIf
Wend

If Size > -1 Then
Local Content:TBank = CreateBank( Size )

' Hack to work around TBank.Read only reading a certain number of bytes.
For Local i:Int = 0 To Size - 1
Content.PokeByte( i, ReadByte( HTTPStream ) )
Next

CloseStream( HTTPStream )

Return CreateBankStream( Content )
Else
Return Null
EndIf
EndIf
End Method

End Type

New THTTPStreamFactory


(Ich weiss nicht ob dies der beste Weg ist, es zu tun...)

Installation: Diese Datei in den Ordner BlitzMax/mod/elephant.mod/httpstream.mod/ speichern, und in der IDE CTRL+D ausführen, um das Modul zu kompilieren.

Viel Spass!

EDIT2: Framework ist nicht zwingend von nöten, einfaches Import Elephant.HTTPStream reicht schon aus.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

ZEVS

BeitragSo, Feb 19, 2012 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß, das Thema ist nicht mehr das neuste, aber ich bin gerade auf etwas gestoßen.
OpenFile-Doku hat Folgendes geschrieben:
This command is similar to the OpenStream command but will attempt to cache the contents of the file to ensure serial streams such as http: based url's are seekable. Use the CloseStream command when finished reading and or writing to a Stream returned by OpenFile.

Da ReadFile darauf zurückgreift, funktioniert BlitzMax: [AUSKLAPPEN]
LoadImage(ReadFile("http::darkwars.da.funpic.de/Universe.jpg"))

Scheint mir das kürzeste Wink Vielleicht sollte man Mark mal darum bitten, bei LoadPixmap OpenFile statt OpenStream zu benutzen.

ZEVS

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group