Code: Select all
;****************************************************************
; Program: Send/Receive image over network Demo
; Author: netmaestro
; Date: March 23, 2007
; Target OS: Microsoft Windows All
; Target Compiler: PureBasic 4.xx
; License: Free, unrestricted, credit appreciated
; but not required
;****************************************************************
; ***************************************************
; Off-Topic: Image to test with
; ***************************************************
UseJPEGImageDecoder()
ProcedureDLL Read_File(file.s)
#INTERNET_FLAG_RELOAD = $80000000
Bytes.l = 0
*html = AllocateMemory(50000)
hInet.l = InternetOpen_("lloydsplace.com", 1, #Null, #Null, 0)
If hInet
hURL.l = InternetOpenUrl_(hInet, file, #Null, 0, #INTERNET_FLAG_RELOAD, 0)
If hURL
If InternetReadFile_(hURL, *html, 50000, @Bytes)
hBmp = CatchImage(#PB_Any,*html, bytes)
InternetCloseHandle_(hURL)
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
InternetCloseHandle_(hInet)
Else
ProcedureReturn 0
EndIf
ProcedureReturn hBmp
EndProcedure
hBmp = Read_File("http://lloydsplace.com/kylie-minogue.jpg")
If IsImage(hBmp)
MessageRequester("", "Image is downloaded, click to test image prep/reconstitution",$C0)
Else
MessageRequester("oops", "problem downloading the image - try with something else", $C0)
End
EndIf
;**************************************************************
; End of Off-Topic Section - Start paying attention now
;**************************************************************
Global BmiInfo.BITMAPINFOHEADER, bmpWidth.w, bmpHeight.w
Procedure Get24BitColors(pBitmap)
GetObject_(pBitmap, SizeOf(BITMAP), @bmp.BITMAP)
bytesperrow = 4*((3*bmpWidth+3)/4)
*pPixels = AllocateMemory(bytesperrow*bmpHeight)
hDC = GetWindowDC_(#Null)
iRes = GetDIBits_(hDC, pBitmap, 0, bmpHeight, *pPixels, @bmiInfo, #DIB_RGB_COLORS)
ReleaseDC_(#Null, hDC)
ProcedureReturn *pPixels
EndProcedure
;*************** Prepare image for sending ********************
GetObject_(ImageID(hBmp), SizeOf(BITMAP), @Bmp.BITMAP)
bmpWidth = Bmp\bmWidth
bmpHeight = Bmp\bmHeight
With BmiInfo
\biSize = SizeOf(BITMAPINFOHEADER)
\biWidth = bmpWidth
\biHeight = bmpHeight
\biPlanes = 1
\biBitCount = 24
\biCompression = #BI_RGB
EndWith
*_24bitColors = Get24BitColors(ImageID(hBmp))
ImageSize = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + MemorySize(*_24bitColors)
*rawimage = AllocateMemory(ImageSize)
*fileheader.BITMAPFILEHEADER = *rawimage
*header.BITMAPINFOHEADER = *rawimage + SizeOf(BITMAPFILEHEADER)
With *fileheader
\bfType = 19778 ; word containing 2 bytes, 'BM' for 'BIT' 'MAP' ;)
\bfSize = ImageSize
\bfOffBits = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER)
EndWith
CopyMemory(@BmiInfo, *header, SizeOf(BITMAPINFOHEADER))
CopyMemory(*_24bitColors, *rawimage + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER), MemorySize(*_24bitColors))
*PackedImage = AllocateMemory(ImageSize+8)
PackSize = PackMemory(*rawimage, *PackedImage, ImageSize)
;******** All ready to go now, send *PackedImage data and ImageSize *********
; Send image from *PackedImage
; Send ImageSize
; [..]
; Receive image to *PackedImage
; Receive imagesize to ImageSize.l
; ********* Image is here now, unpack it ************
*UnPacked = AllocateMemory(ImageSize)
UnpackMemory(*PackedImage, *UnPacked)
;********** How'd we do? Catch and display **********
CatchImage(0, *unpacked)
OpenWindow(0,0,0,ImageWidth(0),ImageHeight(0),"Reconstituted Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(0,0,0,0,0,ImageID(0))
Repeat:Until WaitWindowEvent() = #WM_CLOSE