Code archives/Networking/LoadWebImage
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This is pretty cool! You can load an image stored on your web server (or from any site really), and use it in your game :) Very easily adapted for other kinds of files, of course! Keeping up with latest BlitzGet function (progress readout while loading, etc)! [EDITED, yikes, 10 year old post... to fix example URL!] | |||||
; ----------------------------------------------------------------------------- ; LoadWebImage -- uses BlitzGet Deluxe, based on Mark Sibly's HTTPGet ; ----------------------------------------------------------------------------- ; james@hi-toro.com ; ----------------------------------------------------------------------------- AppTitle "LoadWebImage" Graphics 640, 480 SetBuffer BackBuffer () ; ----------------------------------------------------------------------------- ; Load an image from the web, straight into our game! ; ----------------------------------------------------------------------------- rocket = LoadWebImage ("http://www.hi-toro.com/boing.png") ; ----------------------------------------------------------------------------- ; Check for failure ; ----------------------------------------------------------------------------- If rocket = 0 RuntimeError "Failed to load web image!": End ; Alternative (BETTER) failure method -- use a default local image supplied with your game... ; rocket = LoadImage ("rocket.bmp") EndIf MaskImage rocket, 255, 0, 255 x = 50 y = 50 ClsColor 70, 110, 190 Repeat Cls DrawImage rocket, MouseX (), MouseY () Flip Until KeyDown (1) = 1 End Function LoadWebImage (webFile$) If BlitzGet (webFile$, CurrentDir (), "temp_web_image.bmp") image = LoadImage ("temp_web_image.bmp") DeleteFile "temp_web_image.bmp" EndIf Return image End Function Function BlitzGet (webFile$, saveDir$, saveFile$) ; ------------------------------------------------------------------------- ; Strip "http://" if provided ; ------------------------------------------------------------------------- If Left (webFile$, 7) = "http://" Then webFile$ = Right (webFile$, Len (webFile$) - 7) ; ------------------------------------------------------------------------- ; Split into hostname and path/filename to download ; ------------------------------------------------------------------------- slash = Instr (webFile$, "/") If slash webHost$ = Left (webFile$, slash - 1) webFile$ = Right (webFile$, Len (webFile$) - slash + 1) Else webHost$ = webFile$ webFile$ = "/" EndIf ; ------------------------------------------------------------------------- ; Add trailing slash to download dir if not given ; ------------------------------------------------------------------------- If Right (saveDir$, 1) <> "\" Then saveDir$ = saveDir$ + "\" ; ------------------------------------------------------------------------- ; Save filename -- get from webFile$ if not provided ; ------------------------------------------------------------------------- If saveFile$ = "" If webFile = "/" saveFile$ = "Unknown file.txt" Else For findSlash = Len (webFile$) To 1 Step - 1 testForSlash$ = Mid (webFile$, findSlash, 1) If testForSlash$ = "/" saveFile$ = Right (webFile$, Len (webFile$) - findSlash) Exit EndIf Next If saveFile$ = "" Then saveFile$ = "Unknown file.txt" EndIf EndIf ; DEBUG ; RuntimeError "Web host: " + webHost$ + Chr (10) + "Web file: " + webFile$ + Chr (10) + "Save dir: " + saveDir$ + Chr (10) + "Save file: " + saveFile$ www = OpenTCPStream (webHost$, 80) If www WriteLine www, "GET " + webFile$ + " HTTP/1.1" ; GET / gets default page... WriteLine www, "Host: " + webHost$ WriteLine www, "User-Agent: BlitzGet Deluxe" WriteLine www, "Accept: */*" WriteLine www, "" ; --------------------------------------------------------------------- ; Find blank line after header data, where the action begins... ; --------------------------------------------------------------------- Repeat header$ = ReadLine (www) If Left (header$, 16) = "Content-Length: " ; Number of bytes to read bytesToRead = Right (header$, Len (header$) - 16) EndIf Until header$ = "" Or (Eof (www)) If bytesToRead = 0 Then Goto skipDownLoad ; --------------------------------------------------------------------- ; Create new file to write downloaded bytes into ; --------------------------------------------------------------------- save = WriteFile (saveDir$ + saveFile$) If Not save Then Goto skipDownload ; --------------------------------------------------------------------- ; Incredibly complex download-to-file routine... ; --------------------------------------------------------------------- For readWebFile = 1 To bytesToRead If Not Eof (www) Then WriteByte save, ReadByte (www) ; Call BytesReceived with position and size every 100 bytes (slows down a LOT with smaller updates) tReadWebFile = readWebFile If tReadWebFile Mod 100 = 0 Then BytesReceived (readWebFile, bytesToRead) Next CloseFile save ; Fully downloaded? If (readWebFile - 1) = bytesToRead success = 1 EndIf ; Final update (so it's not rounded to nearest 100 bytes!) BytesReceived (bytesToRead, bytesToRead) .skipDownload CloseTCPStream www Else RuntimeError "Failed to connect" EndIf Return success End Function ; ----------------------------------------------------------------------------- ; User-defined update function, called every 100 bytes of download -- alter to suit! ; ----------------------------------------------------------------------------- ; TIP: Pass a user-defined type instead, with all data (this stuff plus URL, local filename, etc) ; ----------------------------------------------------------------------------- Function BytesReceived (posByte, totalBytes) ; Example update code... Cls Text 20, 20, "Downloading file -- please wait..." Text 20, 40, "Received: " + posByte + "/" + totalBytes + " bytes (" + Percent (posByte, totalBytes) + "%)" Flip End Function ; ----------------------------------------------------------------------------- ; Handy percentage function ; ----------------------------------------------------------------------------- Function Percent (part#, total#) Return Int (100 * (part / total)) End Function |
Comments
| ||
Edit - oops, wrong button :o) |
| ||
Alternative to load an image from a website: img:TImage = LoadImage(LoadBank("http::blitzbasic.com/img/brllogo-thin.png")) |
| ||
First time I found this, I thought I'd post a LoadWebImage function I made a while back that I'm actually quite proud of. It's slow, messy, and mostly uncommented, but it gets the job done. I was able to learn a lot about the .bmp file format making this and how many worthless bytes is has at the beginning of the file. Oh, and I forgot to mention that it supports only the .bmp file format. You can track loading prograss in the debuglog if you like. |
Code Archives Forum