Didn't think of using GrabImage(). Probably be a bit faster than writing to each individual pixel of the pixmap. Still would be better if the captured image originally had a solid alpha to begin with. :)
This is basically what I was trying to do. :)
' Thanks to Freak from the PureBasic forums for assistance!
Type SimpleCapParams
Field mTargetBuf:Byte Ptr ' Must be at least mWidth * mHeight * SizeOf(Int) of size!
Field mWidth
Field mHeight
End Type
Global InitCOM () "C"
Global CountCaptureDevices () "C"
Global OpenCaptureDevice (device, scp:Byte Ptr) "C"
Global CloseCaptureDevice (device) "C"
Global GetCapture (device) "C"
Global CaptureDone (device) "C"
Global CaptureDeviceName (device, name:Byte Ptr, namelen) "C"
Global ESCAPIDLLVersion () "C"
Function SetupESCAPI ()
esc = LoadLibraryA ("escapi.dll")
If esc
InitCOM = GetProcAddress (esc, "initCOM")
CountCaptureDevices = GetProcAddress (esc, "countCaptureDevices")
OpenCaptureDevice = GetProcAddress (esc, "initCapture")
CloseCaptureDevice = GetProcAddress (esc, "deinitCapture")
GetCapture = GetProcAddress (esc, "doCapture")
CaptureDone = GetProcAddress (esc, "isCaptureDone")
CaptureDeviceName = GetProcAddress (esc, "getCaptureDeviceName")
ESCAPIDLLVersion = GetProcAddress (esc, "ESCAPIDLLVersion")
If InitCOM = Null Or CountCaptureDevices = Null Or OpenCaptureDevice = Null or..
CloseCaptureDevice = Null Or GetCapture = Null Or CaptureDone = Null or..
CaptureDeviceName = Null Or ESCAPIDLLVersion = Null
DebugLog "Function missing!"
Return 0
EndIf
InitCOM ()
If ESCAPIDLLVersion () < $200
DebugLog "Old DLL (needs version 2.0+)"
Return 0
EndIf
Else
DebugLog "Failed to open DLL"
Return 0
EndIf
Return 1
End Function
Function CaptureDevice$ (device)
Local cam:Byte [1024]
CaptureDeviceName (device, cam, 1024)
Return String.FromCString (cam)
End Function
If SetupESCAPI () = 0
Notify "Error! Make sure escapi.dll is in same folder and capture device plugged in!"
End
EndIf
For num = 0 Until CountCaptureDevices ()
Print "Capture device [" + num + "] name: " + CaptureDevice (num)
Next
device = 0
' To list/select devices...
'Repeat
' device = Int (Input ("Enter capture device number: "))
'Until device > -1 And device < CountCaptureDevices ()
' Preferred target width/height (ESCAPI scales capture data to this)...
width = 320
height = 240
AppTitle = "Using " + CaptureDevice (device) + "..."
Graphics width, height', 32
' Data structure...
Local scp:SimpleCapParams = New SimpleCapParams
' A PixMap for captured data...
pix:TPixmap = CreatePixmap (width, height, PF_BGRA8888)
pixlist:TList = CreateList()
Local drawpix:TImage
' Stick pixmap memory pointer into data structure...
scp.mTargetBuf = PixmapPixelPtr (pix)
scp.mWidth = width
scp.mHeight = height
' Start capture process...
If OpenCaptureDevice (device, scp) = 0
Print "Failed to initialise capture device!"
End
EndIf
SetBlend ALPHABLEND
Repeat
Cls
GetCapture (device)
Repeat
If KeyHit (KEY_ESCAPE) Then quit = True
Until CaptureDone (device)
newpix:TImage = CreateImage(width,height)
DrawPixmap pix,0,0
GrabImage(newpix,0,0)
ListAddFirst(pixlist,newpix)
Local alpha:Float = 1.0
For drawpix = EachIn pixlist
SetAlpha alpha
DrawImage drawpix, 0, 0
alpha :* .5
Next
If CountList(pixlist) > 10 Then ListRemove(pixlist,drawpix)
Flip
Until quit = True
' Stop capture process...
CloseCaptureDevice (device)
Endedit:To change device# to 0 since I orginally had it set to 1 because that's what my webcam is on. :)
edit again :This is pure madness. :)
' Thanks to Freak from the PureBasic forums for assistance!
Type SimpleCapParams
Field mTargetBuf:Byte Ptr ' Must be at least mWidth * mHeight * SizeOf(Int) of size!
Field mWidth
Field mHeight
End Type
Global InitCOM () "C"
Global CountCaptureDevices () "C"
Global OpenCaptureDevice (device, scp:Byte Ptr) "C"
Global CloseCaptureDevice (device) "C"
Global GetCapture (device) "C"
Global CaptureDone (device) "C"
Global CaptureDeviceName (device, name:Byte Ptr, namelen) "C"
Global ESCAPIDLLVersion () "C"
Function SetupESCAPI ()
esc = LoadLibraryA ("escapi.dll")
If esc
InitCOM = GetProcAddress (esc, "initCOM")
CountCaptureDevices = GetProcAddress (esc, "countCaptureDevices")
OpenCaptureDevice = GetProcAddress (esc, "initCapture")
CloseCaptureDevice = GetProcAddress (esc, "deinitCapture")
GetCapture = GetProcAddress (esc, "doCapture")
CaptureDone = GetProcAddress (esc, "isCaptureDone")
CaptureDeviceName = GetProcAddress (esc, "getCaptureDeviceName")
ESCAPIDLLVersion = GetProcAddress (esc, "ESCAPIDLLVersion")
If InitCOM = Null Or CountCaptureDevices = Null Or OpenCaptureDevice = Null or..
CloseCaptureDevice = Null Or GetCapture = Null Or CaptureDone = Null or..
CaptureDeviceName = Null Or ESCAPIDLLVersion = Null
DebugLog "Function missing!"
Return 0
EndIf
InitCOM ()
If ESCAPIDLLVersion () < $200
DebugLog "Old DLL (needs version 2.0+)"
Return 0
EndIf
Else
DebugLog "Failed to open DLL"
Return 0
EndIf
Return 1
End Function
Function CaptureDevice$ (device)
Local cam:Byte [1024]
CaptureDeviceName (device, cam, 1024)
Return String.FromCString (cam)
End Function
If SetupESCAPI () = 0
Notify "Error! Make sure escapi.dll is in same folder and capture device plugged in!"
End
EndIf
For num = 0 Until CountCaptureDevices ()
Print "Capture device [" + num + "] name: " + CaptureDevice (num)
Next
device = 0
' To list/select devices...
'Repeat
' device = Int (Input ("Enter capture device number: "))
'Until device > -1 And device < CountCaptureDevices ()
' Preferred target width/height (ESCAPI scales capture data to this)...
width = 320
height = 240
AppTitle = "Using " + CaptureDevice (device) + "..."
Graphics width, height', 32
' Data structure...
Local scp:SimpleCapParams = New SimpleCapParams
' A PixMap for captured data...
pix:TPixmap = CreatePixmap (width, height, PF_BGRA8888)
pixlist:TList = CreateList()
Local drawpix:TImage
' Stick pixmap memory pointer into data structure...
scp.mTargetBuf = PixmapPixelPtr (pix)
scp.mWidth = width
scp.mHeight = height
' Start capture process...
If OpenCaptureDevice (device, scp) = 0
Print "Failed to initialise capture device!"
End
EndIf
SetBlend ALPHABLEND
Repeat
Cls
GetCapture (device)
Repeat
If KeyHit (KEY_ESCAPE) Then quit = True
Until CaptureDone (device)
newpix:TImage = CreateImage(width,height)
DrawPixmap pix,0,0
GrabImage(newpix,0,0)
ListAddFirst(pixlist,newpix)
Local alpha:Float = 1.0
Local zip:Int = 0
For drawpix = EachIn pixlist
If zip < 5
zip :+ 1
Else
SetAlpha alpha
DrawImage drawpix, 0, 0
alpha :* .5
zip = 0
End If
Next
If CountList(pixlist) > 100 Then ListRemove(pixlist,drawpix)
Flip
Until quit = True
' Stop capture process...
CloseCaptureDevice (device)
End