Bild aus dem Internet laden

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Dare Devil hat geschrieben:Naja dein Virenscanner hat sogar bei einer Datei gemeckert, die weder Internetverbindung aufgebaut hat, noch irgendwelche Dateien ausgelesen oder geschrieben hat :mrgreen:
ich vermute eher, mein scanner hat gemeckert beim runterladen einer unsignierten exe von einem als unsicher eingestuften server - oder irgendsowas.
tatsächlich gehört AVAST zu den weniger empfindlichen VS, deswegen benutze ich ihn.
Dare Devil hat geschrieben:Spass beiseite, kann man so ein Virenscannergemecker verhindern?
generell sind Virenscanner dazu da, dass man sie nicht einfach am Meckern hindern kann, sonst bräuchte man sie ja garnicht.

also kannst du als erstes deine Kunden drauf hinweisen.
außerdem kannst du Fehlalarme bei den Firmen die Virenscanner bauen melden, damit die vermieden werden.
das ist aber wirklich nur sinnvoll, wenn du ein fertiges Projekt hast, das bei deinen Kunden Verwirrung verursacht.
für irgendwelchen Kokkolores werden die nicht an ihren Ausnahme-Libs arbeiten, da hätten die viel zu tun.
Dare Devil hat geschrieben:Hab ausserdem noch nie mit der API gearbeitet ... muss mich dann wohl erstmal umguckn wie das geht /:->
das ist auch nicht so schwierig... im Grunde ganz normale Funktionsaufrufe.
die Doku ist halt sehr, sehr umfangreich, und es ist - logisch - OS-spezifisch.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

ts-soft hat geschrieben:Da fehlt auf jedem Fall das InitNetwork(), weil so funzt das nicht :mrgreen:
Das ist selbstverständlich :wink:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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 »

RSBasic hat geschrieben:
ts-soft hat geschrieben:Da fehlt auf jedem Fall das InitNetwork(), weil so funzt das nicht :mrgreen:
Das ist selbstverständlich :wink:
Finde ich nicht, mache nämlich nie was mit der Netzwerklib. Das gehört für
mich zum Webgadet, also wozu InitNetwork() :mrgreen:
Ich denke mal, das werden die meisten Einsteiger vergessen!
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
HW-SW-Tüftler
Beiträge: 8
Registriert: 30.07.2009 07:34
Wohnort: Schaafheim - Mosbach

Re: Bild aus dem Internet laden

Beitrag von HW-SW-Tüftler »

Hallo Zusammen,

bei dem Code aus dem Code-Archiv, den ts-soft zitiert hat, habe ich das Problem, dass das offensichtlich nicht stabil mit allen Bildern/Websites ohne Absturz des Programms funktioniert. :(
Ich benötige den Bilder-Download und die Bild-Weiterbehandlung für ein Firmen-internes Programm, das auf Intranet-Seiten zugreift. Dort ist es so, dass ich die betreffenden Bilder durch einen Workaround doch heruntergeladen bekomme, indem ich eine MessageBoxTimeout() vor der InternetOpenUrl_()-Funktion einbaue. Dann läuft es seltsamerweise stabil.
Leider kann ich die entsprechenden Intranet-Links nicht weitergeben (würden ja auch nicht funktionieren).

Ich habe daher nach Beispielen im Internet gesucht. Beim Reichelt-Logo beispielsweise kachelt die Prozedur ab, bei den meisten anderen Bildern klappt's problemlos.

Hier ein Beispiel-Code:

Code: Alles auswählen

EnableExplicit

;****************************************** enumerierte Konstanten ************************************************************************************************

;***Fenster ***
Enumeration
   #Haupt_Fenster
EndEnumeration

;***Gadgets ***
Enumeration
   #ImageGadget_Test1
   #Textgadget_Test_Bild1
   #WebGadget_Test_Bild1
   #ImageGadget_Test2
   #Textgadget_Test_Bild2
   #WebGadget_Test_Bild2
EndEnumeration

;***Bilder ***
Enumeration
   #Test_Bild1
   #Test_Bild2
   #Leer_Bild
EndEnumeration

;****************************************** Variablen *************************************************************************************************************

Global URL_Test_Bild1$  = ""
Global URL_Test_Bild2$  = ""

Global Test_Bildbreite = 128
Global Test_Bildhoehe  = 128

Global Event.l = 0
Global i.l = 0

Global *Mem
Global *ReadMem
Global Bytes_Downloaded_ToMem.l = 0
Global MemString$ = ""

;****************************************** Prozeduren ************************************************************************************************************

#MB_TIMEDOUT = $7D00  ;########################################################################### gehört zu MessageBoxTimeout() dazu
Prototype.i MBTimeOut(hwnd.i, lpText.s, lpCaption.s, uType.l, wLanguageId.w, dwMilliseconds.l);### gehört zu MessageBoxTimeout() dazu

Procedure MessageBoxTimeout(hwnd.i, lpText.s, lpCaption.s, uType.l, dwMilliseconds.l)
   
   Protected hDLL = GetModuleHandle_("user32")
   Protected FuncString.s
   Protected MBTimeOut.MBTimeOut
   
   CompilerIf #PB_Compiler_Unicode
      FuncString.s = Space(17)
      PokeS(@FuncString, "MessageBoxTimeoutW", -1, #PB_Ascii)
   CompilerElse
      FuncString.s = "MessageBoxTimeoutA"
   CompilerEndIf
   
   If hDLL
      MBTimeOut = GetProcAddress_(hDLL, @FuncString)
      If MBTimeOut
         ProcedureReturn MBTimeOut(hwnd, lpText, lpCaption, uType, 0, dwMilliseconds)
      EndIf
   Else
      Debug "Error: MessageBoxTimeout"
   EndIf
EndProcedure

Procedure.l DownloadToMem(url.s, *lpRam, ramsize.l) 
   Protected agent.s, hINet.l, hFile.l, hData.l, bytes.l 
   
   ;  #INTERNET_OPEN_TYPE_DIRECT    = 1 
   ;  #INTERNET_DEFAULT_HTTP_PORT   = 80 
   ;  #INTERNET_SERVICE_HTTP        = 3 
   ;  #INTERNET_FLAG_NO_CACHE_WRITE = $4000000 
   ;  #INTERNET_FLAG_RELOAD         = $8000000 
   
   ;agent.s = "Mozilla/4.0 (compatible; ST)"
   ;agent.s = "Microsoft Internet Explorer Mozilla/4.0" 
   agent.s = "Netscape Mozilla/5.0"
   
   ;MessageRequester("Info", "Vor InternetOpen_()-Funktion...", #PB_MessageRequester_Ok)
   hINet.l = InternetOpen_( @agent.s,0,0,0,0 )
   ;MessageRequester("Info", "Nach InternetOpen_()-Funktion...", #PB_MessageRequester_Ok)
   If hINet > 0
      MessageRequester("Info", "Vor InternetOpenUrl_()-Funktion...", #PB_MessageRequester_Ok)
      ;MessageBoxTimeout(#Haupt_Fenster, "Vor InternetOpenUrl_()-Funktion...", "MessageTimeOut-Box", #MB_OK, 1000)
      hData.l = InternetOpenUrl_( hINet, @url.s, "", 0, $8000000, 0 ) 
   
      If hData > 0
         ;MessageRequester("Info", "Vor InternetReadFile_()-Funktion...", #PB_MessageRequester_Ok)
         InternetReadFile_( hData, *lpRam, ramsize.l, @bytes.l )
      Else
         bytes = -1
      EndIf
      InternetCloseHandle_(hINet) 
      InternetCloseHandle_(hFile) 
      InternetCloseHandle_(hData) 
   Else
      MessageRequester("Info", "Konnte InternetOpen_()-Funktion nicht erfolgreich ausführen!!!", #PB_MessageRequester_Ok)
      bytes = -2
   EndIf
   ProcedureReturn bytes.l 
EndProcedure

;****************************************** Hauptprogramm **********************************************************************************************************

If OpenWindow(#Haupt_Fenster, 0, 0, 800, 800, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
   
   UseJPEGImageDecoder()
   UsePNGImageDecoder()
   
   InitNetwork()
   
   If CreateImage(#Leer_Bild, 128, 128, 24, RGB($FF, $FF, $FF))
      ImageGadget(#ImageGadget_Test1, 10, 10, 128, 128, ImageID(#Leer_Bild), #PB_Image_Border)
      GadgetToolTip(#ImageGadget_Test1, "Gadget initialisiert, aber noch kein Bild geladen!")
      TextGadget(#Textgadget_Test_Bild1, 10, 140, 128, 16, "Test-Bild", #PB_Text_Center)
      WebGadget(#WebGadget_Test_Bild1, 150, 10, 400, 400,"") 
      
      ImageGadget(#ImageGadget_Test2, 10, 420, 128, 128, ImageID(#Leer_Bild), #PB_Image_Border)
      GadgetToolTip(#ImageGadget_Test2, "Gadget initialisiert, aber noch kein Bild geladen!")
      TextGadget(#Textgadget_Test_Bild2, 10, 550, 128, 16, "Test-Bild", #PB_Text_Center)
      WebGadget(#WebGadget_Test_Bild2, 150, 420, 400, 400,"")      
      
      
      URL_Test_Bild1$ = "https://shop.aswo.com/upload/Image/2015_CCDame2_web.jpg"                      ;funktioniert problemlos...
 
      
      URL_Test_Bild2$ = "https://www.reichelt.de/bilder/elements/header/logo_2016/reichelt-logo.png"   ;funktioniert nicht, Programm endet unerwartet...
      ;URL_Test_Bild2$ = "https://cdn-reichelt.de/bilder/web/awo_ws/D300/WERA6147_06.jpg"              ;funktioniert problemlos...
      
      ;Workaround für die Intranet-Bilder bislang durch MessageRequester VOR InternetOpenUrl_()
      ;bei der Reichelt-Logo funktioniert auch das nicht!
       
   
      URL_Test_Bild1$ = URLEncoder(URL_Test_Bild1$, #PB_UTF8)
      ;MessageRequester("Info", "URL_Test_Bild$ = "+URL_Test_Bild$, #PB_MessageRequester_Ok)
      SetGadgetText(#WebGadget_Test_Bild1, URL_Test_Bild1$)
      
      *Mem = AllocateMemory(1048576)  ;1MB
      
      Bytes_Downloaded_ToMem = DownloadToMem(URL_Test_Bild1$, *Mem, 1048576)
      ;MessageRequester("Info", "Bytes_Downloaded_ToMem = "+Str(Bytes_Downloaded_ToMem)+" Bytes", #PB_MessageRequester_Ok)
      ;MessageRequester("Info", "Mem$ = "+URLDecoder(Mem$), #PB_MessageRequester_Ok)
      If Bytes_Downloaded_ToMem > 0
         If CatchImage(#Test_Bild1, *Mem)
            ResizeImage(#Test_Bild1, Test_Bildbreite, Test_Bildhoehe, #PB_Image_Smooth)
            SetGadgetState(#ImageGadget_Test1, ImageID(#Test_Bild1))
            GadgetToolTip(#ImageGadget_Test1, URL_Test_Bild1$)
         Else
            ;MessageRequester("Info", "Konnte Test-Bild nicht extrahieren!", #PB_MessageRequester_Ok)
            SetGadgetState(#ImageGadget_Test1, ImageID(#Leer_Bild))
            GadgetToolTip(#ImageGadget_Test1, "Konnte Bild von Test-URL nicht extrahieren!")
         EndIf
         FreeMemory(*Mem)
      ElseIf Bytes_Downloaded_ToMem = -1 ;URL-Connection erfolgreich, aber kein Bild...
         SetGadgetState(#ImageGadget_Test1, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test1, "Kein Bild in Test-URL gefunden!")
      ElseIf Bytes_Downloaded_ToMem = -2 ;schon URL-Connection war nicht erfolgreich!!!
         SetGadgetState(#ImageGadget_Test1, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test1, "Verbindung zur Test-Seite per InternetOpen_()-Funktion nicht erfolgreich!")
      Else
         SetGadgetState(#ImageGadget_Test1, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test1, "Nicht definierter Fehler!")
      EndIf
           
      
      URL_Test_Bild2$ = URLEncoder(URL_Test_Bild2$, #PB_UTF8)
      ;MessageRequester("Info", "URL_Test_Bild$ = "+URL_Test_Bild$, #PB_MessageRequester_Ok)
      SetGadgetText(#WebGadget_Test_Bild2, URL_Test_Bild2$)
      
      *Mem = AllocateMemory(1048576)  ;1MB
      
      Bytes_Downloaded_ToMem = DownloadToMem(URL_Test_Bild2$, *Mem, 1048576)
      ;MessageRequester("Info", "Bytes_Downloaded_ToMem = "+Str(Bytes_Downloaded_ToMem)+" Bytes", #PB_MessageRequester_Ok)
      ;MessageRequester("Info", "Mem$ = "+URLDecoder(Mem$), #PB_MessageRequester_Ok)
      If Bytes_Downloaded_ToMem > 0
         If CatchImage(#Test_Bild2, *Mem)
            ResizeImage(#Test_Bild2, Test_Bildbreite, Test_Bildhoehe, #PB_Image_Smooth)
            SetGadgetState(#ImageGadget_Test2, ImageID(#Test_Bild2))
            GadgetToolTip(#ImageGadget_Test2, URL_Test_Bild2$)
         Else
            ;MessageRequester("Info", "Konnte Test-Bild nicht extrahieren!", #PB_MessageRequester_Ok)
            SetGadgetState(#ImageGadget_Test2, ImageID(#Leer_Bild))
            GadgetToolTip(#ImageGadget_Test2, "Konnte Bild von Test-URL nicht extrahieren!")
         EndIf
         FreeMemory(*Mem)
      ElseIf Bytes_Downloaded_ToMem = -1 ;URL-Connection erfolgreich, aber kein Bild...
         SetGadgetState(#ImageGadget_Test2, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test2, "Kein Bild in Test-URL gefunden!")
      ElseIf Bytes_Downloaded_ToMem = -2 ;schon URL-Connection war nicht erfolgreich!!!
         SetGadgetState(#ImageGadget_Test2, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test2, "Verbindung zur Test-Seite per InternetOpen_()-Funktion nicht erfolgreich!")
      Else
         SetGadgetState(#ImageGadget_Test2, ImageID(#Leer_Bild))
         GadgetToolTip(#ImageGadget_Test2, "Nicht definierter Fehler!")
      EndIf      
      
      
   EndIf

   
   Repeat
      Event = WindowEvent()
      
      If Event <> 0  ; Alle Ereignisse werden behandelt, so dass wir die Koordinaten der Maus anzeigen können
         SetWindowTitle(#Haupt_Fenster, "Maus-Koordinaten: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0))) 
      Else
         
         Delay(1)  ; Ohne ein FlipBuffers(), Delay() gibt die CPU für das Multitasking frei
      EndIf
   Until Event = #PB_Event_CloseWindow
EndIf
Hat jemand eine Idee, woran das liegt und wie man die Prozedur DownloadToMem() "kugelsicher" bekommt, zumindest kein Absturz, wenn Bild nicht geladen wird, kann man ja evtl. damit umgehen.
____________________________________________________________________________
div. PC's mit Win XP und Win7, div. AMIGA's bis 68060, PureBasic 5.46LTS und Elektronik-Bauteile ohne Ende...

Bei Anderen dampft die Zigarette, bei mir der Lötkolben... :-)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bild aus dem Internet laden

Beitrag von RSBasic »

Der Thread ist sehr alt. Inzwischen gibt es schon lange eine native PB-Funktion: ReceiveHTTPMemory()
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
HW-SW-Tüftler
Beiträge: 8
Registriert: 30.07.2009 07:34
Wohnort: Schaafheim - Mosbach

Re: Bild aus dem Internet laden

Beitrag von HW-SW-Tüftler »

Danke für die superschnelle Antwort!

Als Gelegenheits-Programmierer habe ich nicht immer alle Änderungen in PureBasic auf dem Schirm... :oops:

Da zeigt sich mal wieder, warum ich am liebsten in PureBasic programmiere: "Alles dran, alles drin" :allright:
____________________________________________________________________________
div. PC's mit Win XP und Win7, div. AMIGA's bis 68060, PureBasic 5.46LTS und Elektronik-Bauteile ohne Ende...

Bei Anderen dampft die Zigarette, bei mir der Lötkolben... :-)
Antworten