Problem, ein Bild aus dem Netz zu speichern

Anfängerfragen zum Programmieren mit PureBasic.
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Problem, ein Bild aus dem Netz zu speichern

Beitrag von Gubbie247 »

Hallo.
Ich versuche zurzeit ein bischen mit der flickr-API rumzuspielen, aber ich scheitere schon beim anfangen.
Ich möchte gerne ein bestimmtes Bild als Sprite zur verfügung haben. Der ansatz von mir ist jetzt, das runterzuladen und in eine Datei zu speichern.
Und da fangen die Probleme an.
Beispielurl: http://farm1.static.flickr.com/232/5018 ... f5dd_m.jpg
Die wird zusammengesetzt:

Code: Alles auswählen

network.s = "farm"+bild_farm+".static.flickr.com"
file.s = "/"+bild_server+"/"+bild_id+"_"+bild_secret+"_m.jpg"
Dann die Verbindung und der Header hergetellt:

Code: Alles auswählen

ID2 = OpenNetworkConnection(network, 80)
Header2.s = ""
Header2.s + "GET "+file+" HTTP/1.1" + Chr(10)
Header2.s + "Host: flickr.com" + Chr(10)
Header2.s + "Accept: */*" + Chr(10)
Header2.s + "Connection: Close" + Chr(10) + Chr(10)
Dann abgesendet und sollte empfangen werden:

Code: Alles auswählen

SendNetworkString(ID2, Header2)

*Buffer2 = AllocateMemory(200000)
Repeat
  Delay(2)
Until NetworkClientEvent(ID2) = 2
ReceiveNetworkData(ID2, *Buffer2, MemorySize(*Buffer2))
CloseNetworkConnection(ID2)
Aber er bleibt in der Schleife hängen. Was kann man da tun?
Und die zweite Frage: Wie mache ich aus den Daten, die dann vielleicht irgendwann kommen zuverlässig ein jpg-file?
Vielen Dank

PS. Ich habe keine Vollversion
edit: schade, ich dachte ich hätte ins anfängerforum gepostet. entschuldigung, anfänger halt.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Code: Alles auswählen

InitNetwork()
UseJPEGImageDecoder()
bild_farm.s   = "1"
bild_server.s = "232"
bild_id.s     = "501887545"
bild_secret.s = "420905f5dd"
network.s     = "farm" + bild_farm + ".static.flickr.com"
file.s        = "/" + bild_server + "/" + bild_id + "_" + bild_secret + "_m.jpg"

ID2 = OpenNetworkConnection(network, 80)
If ID2
	Header2.s = ""
	Header2 + "GET " + file + " HTTP/1.1" + #CRLF$
	Header2 + "Host: flickr.com" + #CRLF$
	Header2 + "Accept: */*" + #CRLF$
	Header2 + "Connection: Close" + #CRLF$ + #CRLF$

	SendNetworkString(ID2, Header2)
	*Buffer2  = AllocateMemory(200000)
	TimeOUT.l = ElapsedMilliseconds() + 5000
	L.l       = 0
	Length.l  = 0
	Ges.l     = 0
	Repeat
		Select NetworkClientEvent(ID2)
			Case 2
				L = ReceiveNetworkData(ID2, *Buffer2 + Ges, MemorySize(*Buffer2) - Ges)
				If L > 0
					Ges + L
					If Length = 0
						;Search for End of Header
						A = FindString(PeekS(*Buffer2, Ges), #CRLF$ + #CRLF$, 1)
						If A
							;Search for Content-Length
							B = FindString(PeekS(*Buffer2, Ges), "Content-Length:", 1)
							If B
								;Serach for end of Content-Length
								C = FindString(PeekS(*Buffer2, Ges), " ", B + 17)
								If C
									Length = Val(Mid(PeekS(*Buffer2, A), B + 15, Len(PeekS(*Buffer2, A)) - C))
									Ges - A - 3
									;Overwrite Buffer, cause Header is now unnessesary
									MoveMemory(*Buffer2 + A + 3, *Buffer2, Ges)
								EndIf
							EndIf
						EndIf
					ElseIf Ges >= Length
						;O.k., thats the whole pic
						Break
					EndIf
				EndIf
			Case 0
				Delay(2)
		EndSelect
	Until TimeOUT < ElapsedMilliseconds()
	CloseNetworkConnection(ID2)
	If Ges And Length
		If OpenWindow(0, 420, 188, 252, 190, "Pic", #PB_Window_SystemMenu | #PB_Window_TitleBar) And CreateGadgetList(WindowID(0))
			ImageGadget(0, 5, 5, 330, 255, CatchImage(0, *Buffer2 , Length), #PB_Image_Border)
			While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
		EndIf
	EndIf
EndIf
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Code: Alles auswählen

UseJPEGImageDecoder()

Tempdir$ = GetTemporaryDirectory()

URLDownloadToFile_(0,"http://farm1.static.flickr.com/232/501887545_420905f5dd_m.jpg",Tempdir$ + "test.jpg",0,0)

OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ImageGadget(0,5,5,0,0,LoadImage(0,Tempdir$ + "test.jpg"))

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Wie er bereits sagte, hat er nur die Demo, da hilft die Api nicht.
Klar kann man das passend umwursten, aber man muss ja nicht alles verraten ;)
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Beitrag von Gubbie247 »

Vielen Dank.
Wenn ich versuche den ersten Code zu kompilieren, zeigt er die Fehlermeldung:
Constant not found: #CRLF$
kann ich das einfach durch ein Chr(10) ersetzen?
nach dem ersetzen:
POLINK: fatal error: File not found: 'MSVCRT.LIB'
warum geht das nicht? :cry:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

#CRLF$ ist, wie die Konstante ja schon vermuten lässt: Chr(13) + Chr(10).
Warum die der Demo nicht bekannt sein sollte, ist mir allerdings schleierhaft.

Dein Fehler kommt durch den Einsatz des Jpg-Decoders, der offensichtlich in der Demo nicht wirklich unterstützt wird.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

HeX0R hat geschrieben:#CRLF$ ist, wie die Konstante ja schon vermuten lässt: Chr(13) + Chr(10).
Warum die der Demo nicht bekannt sein sollte, ist mir allerdings schleierhaft.
Ist eine API Konstante. Die Demo wird nur die #PB_ Konstanten kennen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Aha!
Fred ist ja richtig konsequent ;)
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Beitrag von Gubbie247 »

Funktioniert das erste Skript denn? Ich habe mal versucht den jpg-decoder aussen vor zu lassen und das ganze in einer Datei zu speicher, aber es kommt nie zu dem 'Case 2', es kommt nichts an. Das geht doch mit anderen webseiten, warum hier nicht?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Jo, das erste geht, sonst hätte ich es gar nicht erst veröffentlicht.
Wahrscheinlich hast du wieder nur Chr(10) verwendet anstatt Chr(13) + Chr(10) , weil das mag der Server nicht wirklich und sendet dann nix.
Antworten