 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
goldensoft
Joined: 23 Jul 2007 Posts: 11
|
Posted: Mon Jul 23, 2007 10:50 pm Post subject: Impossible to Save a WebCam Shot into an image file? |
|
|
For the past 3 days I'm trying to save a webcam shot to an image file but until now no luck. Bellow is the script that I'm using. This script was originally created by daonlyfreez http://www.autohotkey.com/forum/topic17042.html it allows to copy the current webcam image to the clipboard but lacks the ability to save the image to a file. Any ideas on how to resolve this?
| Code: |
; http://ej.bantz.com/video/
; http://ej.bantz.com/video/detail/
; http://www.dotnet4all.com/dotnet-code/2004/12/video-capture.html
/*
Full blown app possible settings/options (inspired by Dorgem)
* Video stream:
resolution
pixel depth and compression
size (bytes)
* Capture:
1 - file
filetype (avi/pictures)
compression
framerate
location/path
watermark
auto-name
refreshrate (replace or add to max)
2 - ftp (file settings +)
url:port
log
* Motion detection:
sensitivity
action (run, email)
* Multiple camera support ???
*/
; Basic Demo - v 0.2
hModule := DllCall("LoadLibrary", "str", "avicap32.dll")
Gui, Add, GroupBox, x4 y4 w492 h100, Available Video Drivers
Gui, Add, ListView, x8 y20 w400 h80 vCapDriversLV, Index|Name
Gui, Add, Picture, x434 y16 w32 h32 Icon204, %A_WinDir%\system32\shell32.dll
Gui, Add, Button, x412 y50 w80 h24 gRefreshDrivers, Refresh
Gui, Add, Button, x412 y76 w80 h24 gSelectDriver vSelectDriverB, Select
; --- Video preview section of Gui
Gui, Add, GroupBox, x4 y108 w492 h262, Video
; Video preview placeholder
Gui, Add, Text, x10 y124 w320 h240 vVidPlaceholder
GuiControl, +0x7, VidPlaceholder ; frame
Gui, Font, s32
Gui, Add, Text, x32 y200 w280 h64 Center, Preview
Gui, Font
Gui, Add, CheckBox, x340 y120 w100 h24 vPreviewToggleState gPreviewToggle, Preview video
Gui, Add, Button, x440 y120 w50 h24 gCopyToClipBoard, Copy
Gui, Add, Button, x400 y160 w90 h24 gSenToFile, &Send to File
/*
; --- Presets section
Gui, Add, GroupBox, x336 y144 w154 h220, Presets
Gui, Add, DropDownList, x342 y164 w142 h30 r30 vPresetChoice, Create new preset...||My save to picture set|My save to avi set|My save to ftp|My motion detection set
Gui, Add, Button, x342 y190 w70 h24 vSelectPresetB, Select
Gui, Add, Button, x414 y190 w70 h24 vNewPresetB, Edit
Gui, Add, Text, x342 y220 w142 h106 vPresetInfoT,
Gui, Add, Button, x342 y334 w70 h24 vRunPresetB, Run
Gui, Add, Button, x414 y334 w70 h24 vStopPresetB, Stop
*/
; --- Statusbar
Gui, Add, StatusBar,, Done
SB_SetIcon("shell32.dll", 222, 1)
; Get drivers
GoSub, RefreshDrivers
; Get handle of Gui
Gui +LastFound
hwndParent := WinExist()
; Show
Gui, Show, x770 y200 w500 h400, Video For Windows for AutoHotkey - VFW4AHK
;Gosub, ConnectToDriver
Return
PreviewToggle:
msgbox Only once!
; If PreviewToggleState
GoSub ConnectToDriver
; Else
; GoSub DisconnectDriver
Return
ConnectToDriver:
; --- Connect and preview
capHwnd := Cap_CreateCaptureWindow(hwndParent, 10, 124, 320, 240)
;ToolTip % errorlevel
WM_CAP := 0x400
WM_CAP_DRIVER_CONNECT := WM_CAP + 10
WM_CAP_DRIVER_DISCONNECT := WM_CAP + 11
WM_CAP_EDIT_COPY := WM_CAP + 30
WM_CAP_SET_PREVIEW := WM_CAP + 50
WM_CAP_SET_PREVIEWRATE := WM_CAP + 52
WM_CAP_SET_SCALE := WM_CAP + 53
; Connect to driver
if SelectedDriver =
{
MsgBox, 16, Error!, You didn't select a video driver
Return
}
SendMessage, WM_CAP_DRIVER_CONNECT, %SelectedDriver%, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview scale
SendMessage, WM_CAP_SET_SCALE, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview rate in milliseconds
SendMessage, WM_CAP_SET_PREVIEWRATE, 66, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Start previewing the image from the camera
SendMessage, WM_CAP_SET_PREVIEW, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
ToolTip
Return
CopyToClipBoard:
SendMessage, WM_CAP_EDIT_COPY, 0, 0, , ahk_id %capHwnd%
Return
SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd%
;DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
ToolTip % errorlevel
return
DisconnectDriver:
SendMessage, WM_CAP_DRIVER_DISCONNECT, 1, 0, , ahk_id %capHwnd%
Return
RefreshDrivers:
foundDriver = 0
LV_Delete()
Loop
{
thisInfo := Cap_GetDriverDescription(A_Index-1)
If thisInfo
{
foundDriver = 1
LV_Add("", A_Index-1, thisInfo)
}
Else
Break
}
If !foundDriver
{
LV_Delete()
LV_Add("", "", "Could not get video drivers")
GuiControl, Disable, CapDriversLV
GuiControl, Disable, SelectDriverB
}
Return
SelectDriver:
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
LV_GetText(SelectedDriver, FocusedRowNumber, 1)
Return
/*
'// The two functions exported by AVICap
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _
ByVal hWndParent As Long, ByVal nID As Long) As Long
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _
ByVal wDriver As Integer, _
ByVal lpszName As String, _
ByVal cbName As Long, _
ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean
*/
Cap_CreateCaptureWindow(hWndParent, x, y, w, h)
{
WS_CHILD := 0x40000000
WS_VISIBLE := 0x10000000
lpszWindowName := "test"
lwndC := DLLCall("avicap32.dll\capCreateCaptureWindowA"
, "Str", lpszWindowName
, "UInt", WS_VISIBLE | WS_CHILD ; dwStyle
, "Int", x
, "Int", y
, "Int", w
, "Int", h
, "UInt", hWndParent
, "Int", 0)
;msgbox % lwndC " | " errorlevel " | " lpszWindowName " | " hwndParent
Return lwndC
}
Cap_GetDriverDescription(wDriver)
{
VarSetCapacity(lpszName, 100)
VarSetCapacity(lpszVer, 100)
res := DLLCall("avicap32.dll\capGetDriverDescriptionA"
, "Short", wDriver
, "Str", lpszName
, "Int", 100
, "Str", lpszVer
, "Int", 100)
If res
capInfo := lpszName ; " | " lpszVer
Return capInfo
}
GuiClose:
GoSub, DisconnectDriver
DllCall("FreeLibrary", "str", hModule)
ExitApp
Return
!r::Reload ; for debugging |
The section of the code responsible for handling the image file generation is:
| Code: | SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id %capHwnd%
;DllCall("User32\SendMessage", Uint, ahk_id %capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
ToolTip % errorlevel
return |
|
|
| Back to top |
|
 |
daonlyfreez
Joined: 16 Mar 2005 Posts: 838 Location: Berlin
|
Posted: Tue Jul 24, 2007 7:35 am Post subject: |
|
|
I cannot test right now, but you'll need the constants
| Code: | WM_USER = 0x0400
WM_CAP_START = WM_USER
WM_CAP_GRAB_FRAME_NOSTOP := WM_USER + 61
WM_CAP_FILE_SAVEDIB := WM_CAP_START + 25 |
_________________
My AHK stuff on ahk.net / on DropBox (mirror) / @home (if online) |
|
| Back to top |
|
 |
goldensoft
Joined: 23 Jul 2007 Posts: 11
|
Posted: Tue Jul 24, 2007 10:59 am Post subject: |
|
|
Thanks daonlyfreez you are correct its needed to add these constants the script is now:
| Code: |
; http://ej.bantz.com/video/
; http://ej.bantz.com/video/detail/
; http://www.dotnet4all.com/dotnet-code/2004/12/video-capture.html
/*
Full blown app possible settings/options (inspired by Dorgem)
* Video stream:
resolution
pixel depth and compression
size (bytes)
* Capture:
1 - file
filetype (avi/pictures)
compression
framerate
location/path
watermark
auto-name
refreshrate (replace or add to max)
2 - ftp (file settings +)
url:port
log
* Motion detection:
sensitivity
action (run, email)
* Multiple camera support ???
*/
; Basic Demo - v 0.2
hModule := DllCall("LoadLibrary", "str", "avicap32.dll")
Gui, Add, GroupBox, x4 y4 w492 h100, Available Video Drivers
Gui, Add, ListView, x8 y20 w400 h80 vCapDriversLV, Index|Name
Gui, Add, Picture, x434 y16 w32 h32 Icon204, %A_WinDir%\system32\shell32.dll
Gui, Add, Button, x412 y50 w80 h24 gRefreshDrivers, Refresh
Gui, Add, Button, x412 y76 w80 h24 gSelectDriver vSelectDriverB, Select
; --- Video preview section of Gui
Gui, Add, GroupBox, x4 y108 w492 h262, Video
; Video preview placeholder
Gui, Add, Text, x10 y124 w320 h240 vVidPlaceholder
GuiControl, +0x7, VidPlaceholder ; frame
Gui, Font, s32
Gui, Add, Text, x32 y200 w280 h64 Center, Preview
Gui, Font
Gui, Add, CheckBox, x340 y120 w100 h24 vPreviewToggleState gPreviewToggle, Preview video
Gui, Add, Button, x440 y120 w50 h24 gCopyToClipBoard, Copy
Gui, Add, Button, x400 y160 w90 h24 gSenToFile, &Send to File
/*
; --- Presets section
Gui, Add, GroupBox, x336 y144 w154 h220, Presets
Gui, Add, DropDownList, x342 y164 w142 h30 r30 vPresetChoice, Create new preset...||My save to picture set|My save to avi set|My save to ftp|My motion detection set
Gui, Add, Button, x342 y190 w70 h24 vSelectPresetB, Select
Gui, Add, Button, x414 y190 w70 h24 vNewPresetB, Edit
Gui, Add, Text, x342 y220 w142 h106 vPresetInfoT,
Gui, Add, Button, x342 y334 w70 h24 vRunPresetB, Run
Gui, Add, Button, x414 y334 w70 h24 vStopPresetB, Stop
*/
; --- Statusbar
Gui, Add, StatusBar,, Done
SB_SetIcon("shell32.dll", 222, 1)
; Get drivers
GoSub, RefreshDrivers
; Get handle of Gui
Gui +LastFound
hwndParent := WinExist()
; Show
Gui, Show, x770 y200 w500 h400, Video For Windows for AutoHotkey - VFW4AHK
;Gosub, ConnectToDriver
Return
PreviewToggle:
msgbox Only once!
; If PreviewToggleState
GoSub ConnectToDriver
; Else
; GoSub DisconnectDriver
Return
ConnectToDriver:
; --- Connect and preview
capHwnd := Cap_CreateCaptureWindow(hwndParent, 10, 124, 320, 240)
;ToolTip % errorlevel
WM_USER = 0x0400
WM_CAP_START = WM_USER
WM_CAP_GRAB_FRAME_NOSTOP := WM_USER + 61
WM_CAP_FILE_SAVEDIB := WM_CAP_START + 25
WM_CAP := 0x400
WM_CAP_DRIVER_CONNECT := WM_CAP + 10
WM_CAP_DRIVER_DISCONNECT := WM_CAP + 11
WM_CAP_EDIT_COPY := WM_CAP + 30
WM_CAP_SET_PREVIEW := WM_CAP + 50
WM_CAP_SET_PREVIEWRATE := WM_CAP + 52
WM_CAP_SET_SCALE := WM_CAP + 53
; Connect to driver
if SelectedDriver =
{
MsgBox, 16, Error!, You didn't select a video driver
Return
}
SendMessage, WM_CAP_DRIVER_CONNECT, %SelectedDriver%, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview scale
SendMessage, WM_CAP_SET_SCALE, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview rate in milliseconds
SendMessage, WM_CAP_SET_PREVIEWRATE, 66, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Start previewing the image from the camera
SendMessage, WM_CAP_SET_PREVIEW, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
ToolTip
Return
CopyToClipBoard:
SendMessage, WM_CAP_EDIT_COPY, 0, 0, , ahk_id %capHwnd%
Return
SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd%
;DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
ToolTip % errorlevel
return
DisconnectDriver:
SendMessage, WM_CAP_DRIVER_DISCONNECT, 1, 0, , ahk_id %capHwnd%
Return
RefreshDrivers:
foundDriver = 0
LV_Delete()
Loop
{
thisInfo := Cap_GetDriverDescription(A_Index-1)
If thisInfo
{
foundDriver = 1
LV_Add("", A_Index-1, thisInfo)
}
Else
Break
}
If !foundDriver
{
LV_Delete()
LV_Add("", "", "Could not get video drivers")
GuiControl, Disable, CapDriversLV
GuiControl, Disable, SelectDriverB
}
Return
SelectDriver:
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
LV_GetText(SelectedDriver, FocusedRowNumber, 1)
Return
/*
'// The two functions exported by AVICap
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _
ByVal hWndParent As Long, ByVal nID As Long) As Long
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _
ByVal wDriver As Integer, _
ByVal lpszName As String, _
ByVal cbName As Long, _
ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean
*/
Cap_CreateCaptureWindow(hWndParent, x, y, w, h)
{
WS_CHILD := 0x40000000
WS_VISIBLE := 0x10000000
lpszWindowName := "test"
lwndC := DLLCall("avicap32.dll\capCreateCaptureWindowA"
, "Str", lpszWindowName
, "UInt", WS_VISIBLE | WS_CHILD ; dwStyle
, "Int", x
, "Int", y
, "Int", w
, "Int", h
, "UInt", hWndParent
, "Int", 0)
;msgbox % lwndC " | " errorlevel " | " lpszWindowName " | " hwndParent
Return lwndC
}
Cap_GetDriverDescription(wDriver)
{
VarSetCapacity(lpszName, 100)
VarSetCapacity(lpszVer, 100)
res := DLLCall("avicap32.dll\capGetDriverDescriptionA"
, "Short", wDriver
, "Str", lpszName
, "Int", 100
, "Str", lpszVer
, "Int", 100)
If res
capInfo := lpszName ; " | " lpszVer
Return capInfo
}
GuiClose:
GoSub, DisconnectDriver
DllCall("FreeLibrary", "str", hModule)
ExitApp
Return
!r::Reload ; for debugging |
but there continues to exist some problems on: | Code: | SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd%
;DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
ToolTip % errorlevel
return |
this line of code refuses to run
| Code: | | SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd% |
I tried to use instead | Code: | DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
|
but I had no luck. Any one can help? |
|
| Back to top |
|
 |
Helpy Guest
|
Posted: Tue Jul 24, 2007 12:25 pm Post subject: |
|
|
I see errors:
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd%
Need a space adter ahk_id
DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
In function calls, you rarely give a dereference of the variable, and even less of the ahk_id, so it should be:
DllCall("User32\SendMessage", Uint, capHwnd, Uint, WM_CAP_FILE_SAVEDIB, Uint, 0, Str, imagefile)
but the command should do the work. |
|
| Back to top |
|
 |
goldensoft
Joined: 23 Jul 2007 Posts: 11
|
Posted: Tue Jul 24, 2007 2:21 pm Post subject: |
|
|
| Quote: | I see errors:
SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id%capHwnd%
Need a space adter ahk_id
DllCall("User32\SendMessage", Uint, ahk_id%capHwnd%, Uint, %WM_CAP_FILE_SAVEDIB%, Uint, 0, Str, %imagefile%)
In function calls, you rarely give a dereference of the variable, and even less of the ahk_id, so it should be:
DllCall("User32\SendMessage", Uint, capHwnd, Uint, WM_CAP_FILE_SAVEDIB, Uint, 0, Str, imagefile)
but the command should do the work. |
I agree with you Helpy about the space after ahk_id and about the DllCall but even after these changes the webcamshot/image file is not saved to the harddisk, here is the full script with the new changes:
| Code: |
; http://ej.bantz.com/video/
; http://ej.bantz.com/video/detail/
; http://www.dotnet4all.com/dotnet-code/2004/12/video-capture.html
/*
Full blown app possible settings/options (inspired by Dorgem)
* Video stream:
resolution
pixel depth and compression
size (bytes)
* Capture:
1 - file
filetype (avi/pictures)
compression
framerate
location/path
watermark
auto-name
refreshrate (replace or add to max)
2 - ftp (file settings +)
url:port
log
* Motion detection:
sensitivity
action (run, email)
* Multiple camera support ???
*/
; Basic Demo - v 0.2
hModule := DllCall("LoadLibrary", "str", "avicap32.dll")
Gui, Add, GroupBox, x4 y4 w492 h100, Available Video Drivers
Gui, Add, ListView, x8 y20 w400 h80 vCapDriversLV, Index|Name
Gui, Add, Picture, x434 y16 w32 h32 Icon204, %A_WinDir%\system32\shell32.dll
Gui, Add, Button, x412 y50 w80 h24 gRefreshDrivers, Refresh
Gui, Add, Button, x412 y76 w80 h24 gSelectDriver vSelectDriverB, Select
; --- Video preview section of Gui
Gui, Add, GroupBox, x4 y108 w492 h262, Video
; Video preview placeholder
Gui, Add, Text, x10 y124 w320 h240 vVidPlaceholder
GuiControl, +0x7, VidPlaceholder ; frame
Gui, Font, s32
Gui, Add, Text, x32 y200 w280 h64 Center, Preview
Gui, Font
Gui, Add, CheckBox, x340 y120 w100 h24 vPreviewToggleState gPreviewToggle, Preview video
Gui, Add, Button, x440 y120 w50 h24 gCopyToClipBoard, Copy
Gui, Add, Button, x400 y160 w90 h24 gSenToFile, &Send to File
/*
; --- Presets section
Gui, Add, GroupBox, x336 y144 w154 h220, Presets
Gui, Add, DropDownList, x342 y164 w142 h30 r30 vPresetChoice, Create new preset...||My save to picture set|My save to avi set|My save to ftp|My motion detection set
Gui, Add, Button, x342 y190 w70 h24 vSelectPresetB, Select
Gui, Add, Button, x414 y190 w70 h24 vNewPresetB, Edit
Gui, Add, Text, x342 y220 w142 h106 vPresetInfoT,
Gui, Add, Button, x342 y334 w70 h24 vRunPresetB, Run
Gui, Add, Button, x414 y334 w70 h24 vStopPresetB, Stop
*/
; --- Statusbar
Gui, Add, StatusBar,, Done
SB_SetIcon("shell32.dll", 222, 1)
; Get drivers
GoSub, RefreshDrivers
; Get handle of Gui
Gui +LastFound
hwndParent := WinExist()
; Show
Gui, Show, x770 y200 w500 h400, Video For Windows for AutoHotkey - VFW4AHK
;Gosub, ConnectToDriver
Return
PreviewToggle:
msgbox Only once!
; If PreviewToggleState
GoSub ConnectToDriver
; Else
; GoSub DisconnectDriver
Return
ConnectToDriver:
; --- Connect and preview
capHwnd := Cap_CreateCaptureWindow(hwndParent, 10, 124, 320, 240)
;ToolTip % errorlevel
WM_USER = 0x0400
WM_CAP_START = WM_USER
WM_CAP_GRAB_FRAME_NOSTOP := WM_USER + 61
WM_CAP_FILE_SAVEDIB := WM_CAP_START + 25
WM_CAP := 0x400
WM_CAP_DRIVER_CONNECT := WM_CAP + 10
WM_CAP_DRIVER_DISCONNECT := WM_CAP + 11
WM_CAP_EDIT_COPY := WM_CAP + 30
WM_CAP_SET_PREVIEW := WM_CAP + 50
WM_CAP_SET_PREVIEWRATE := WM_CAP + 52
WM_CAP_SET_SCALE := WM_CAP + 53
; Connect to driver
if SelectedDriver =
{
MsgBox, 16, Error!, You didn't select a video driver
Return
}
SendMessage, WM_CAP_DRIVER_CONNECT, %SelectedDriver%, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview scale
SendMessage, WM_CAP_SET_SCALE, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview rate in milliseconds
SendMessage, WM_CAP_SET_PREVIEWRATE, 66, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Start previewing the image from the camera
SendMessage, WM_CAP_SET_PREVIEW, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
ToolTip
Return
CopyToClipBoard:
SendMessage, WM_CAP_EDIT_COPY, 0, 0, , ahk_id %capHwnd%
Return
SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
;SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id %capHwnd%
DllCall("User32\SendMessage", Uint, capHwnd, Uint, WM_CAP_FILE_SAVEDIB, Uint, 0, Str, imagefile)
ToolTip % errorlevel
return
DisconnectDriver:
SendMessage, WM_CAP_DRIVER_DISCONNECT, 1, 0, , ahk_id %capHwnd%
Return
RefreshDrivers:
foundDriver = 0
LV_Delete()
Loop
{
thisInfo := Cap_GetDriverDescription(A_Index-1)
If thisInfo
{
foundDriver = 1
LV_Add("", A_Index-1, thisInfo)
}
Else
Break
}
If !foundDriver
{
LV_Delete()
LV_Add("", "", "Could not get video drivers")
GuiControl, Disable, CapDriversLV
GuiControl, Disable, SelectDriverB
}
Return
SelectDriver:
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
LV_GetText(SelectedDriver, FocusedRowNumber, 1)
Return
/*
'// The two functions exported by AVICap
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _
ByVal hWndParent As Long, ByVal nID As Long) As Long
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _
ByVal wDriver As Integer, _
ByVal lpszName As String, _
ByVal cbName As Long, _
ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean
*/
Cap_CreateCaptureWindow(hWndParent, x, y, w, h)
{
WS_CHILD := 0x40000000
WS_VISIBLE := 0x10000000
lpszWindowName := "test"
lwndC := DLLCall("avicap32.dll\capCreateCaptureWindowA"
, "Str", lpszWindowName
, "UInt", WS_VISIBLE | WS_CHILD ; dwStyle
, "Int", x
, "Int", y
, "Int", w
, "Int", h
, "UInt", hWndParent
, "Int", 0)
;msgbox % lwndC " | " errorlevel " | " lpszWindowName " | " hwndParent
Return lwndC
}
Cap_GetDriverDescription(wDriver)
{
VarSetCapacity(lpszName, 100)
VarSetCapacity(lpszVer, 100)
res := DLLCall("avicap32.dll\capGetDriverDescriptionA"
, "Short", wDriver
, "Str", lpszName
, "Int", 100
, "Str", lpszVer
, "Int", 100)
If res
capInfo := lpszName ; " | " lpszVer
Return capInfo
}
GuiClose:
GoSub, DisconnectDriver
DllCall("FreeLibrary", "str", hModule)
ExitApp
Return
!r::Reload ; for debugging |
and here is the problematic source code:
| Code: | SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
;SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id %capHwnd%
DllCall("User32\SendMessage", Uint, capHwnd, Uint, WM_CAP_FILE_SAVEDIB, Uint, 0, Str, imagefile)
ToolTip % errorlevel
return |
Any one knows if its necessary to add something more like WM_CAP_DRIVER_GET_CAPS? |
|
| Back to top |
|
 |
daonlyfreez
Joined: 16 Mar 2005 Posts: 838 Location: Berlin
|
Posted: Tue Jul 24, 2007 2:30 pm Post subject: |
|
|
| Code: | WM_USER := 0x0400
WM_CAP_START := WM_USER |
Try adding the colons (my bad). _________________
My AHK stuff on ahk.net / on DropBox (mirror) / @home (if online) |
|
| Back to top |
|
 |
goldensoft
Joined: 23 Jul 2007 Posts: 11
|
Posted: Tue Jul 24, 2007 4:11 pm Post subject: |
|
|
| Quote: | Code (Copy):
WM_USER := 0x0400
WM_CAP_START := WM_USER
Try adding the colons (my bad). |
Thanks daonlyfreez but I'm afraid this is already in the script. Honestly I don't know what should be changed to save a webcam shot to a file.
I completely searched the Internet and I think this type of functionality hasn't yet been developed for AutoHotKey |
|
| Back to top |
|
 |
System Monitor
Joined: 09 Mar 2007 Posts: 463 Location: Unknown
|
|
| Back to top |
|
 |
Micahs
Joined: 01 Dec 2006 Posts: 413
|
Posted: Tue Jul 24, 2007 7:06 pm Post subject: |
|
|
[img]http://www.autohotkey.net/~Micahs/test/image.bmp[/img] - (Is there something wrong with images? This isn't working!)
First all all, you had a few problems:
| Code: | | WM_CAP_START = WM_USER | Should be:
| Code: | WM_CAP_START := WM_USER
| You were missing the colon!
Also,
| Code: | SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd%
;SendMessage WM_CAP_FILE_SAVEDIB, 0,0, %imagefile%, ahk_id %capHwnd%
DllCall("User32\SendMessage", Uint, capHwnd, Uint, WM_CAP_FILE_SAVEDIB, Uint, 0, Str, imagefile)
ToolTip % errorlevel
return | Should be:
| Code: | SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_FILE_SAVEDIB, 0, &imagefile, , ahk_id %capHwnd%
ToolTip % errorlevel
return
| Your sendmessage was malformed. And you didn't need "WM_CAP_GRAB_FRAME_NOSTOP" because "WM_CAP_FILE_SAVEDIB" already saves the current frame.
Here is a working version:
| Code: |
; http://ej.bantz.com/video/
; http://ej.bantz.com/video/detail/
; http://www.dotnet4all.com/dotnet-code/2004/12/video-capture.html
/*
Full blown app possible settings/options (inspired by Dorgem)
* Video stream:
resolution
pixel depth and compression
size (bytes)
* Capture:
1 - file
filetype (avi/pictures)
compression
framerate
location/path
watermark
auto-name
refreshrate (replace or add to max)
2 - ftp (file settings +)
url:port
log
* Motion detection:
sensitivity
action (run, email)
* Multiple camera support ???
*/
; Basic Demo - v 0.2
hModule := DllCall("LoadLibrary", "str", "avicap32.dll")
Gui, Add, GroupBox, x4 y4 w492 h100, Available Video Drivers
Gui, Add, ListView, x8 y20 w400 h80 vCapDriversLV, Index|Name
Gui, Add, Picture, x434 y16 w32 h32 Icon204, %A_WinDir%\system32\shell32.dll
Gui, Add, Button, x412 y50 w80 h24 gRefreshDrivers, Refresh
Gui, Add, Button, x412 y76 w80 h24 gSelectDriver vSelectDriverB, Select
; --- Video preview section of Gui
Gui, Add, GroupBox, x4 y108 w492 h262, Video
; Video preview placeholder
Gui, Add, Text, x10 y124 w320 h240 vVidPlaceholder
GuiControl, +0x7, VidPlaceholder ; frame
Gui, Font, s32
Gui, Add, Text, x32 y200 w280 h64 Center, Preview
Gui, Font
Gui, Add, CheckBox, x340 y120 w100 h24 vPreviewToggleState gPreviewToggle, Preview video
Gui, Add, Button, x440 y120 w50 h24 gCopyToClipBoard, Copy
Gui, Add, Button, x400 y160 w90 h24 gSenToFile, &Send to File
/*
; --- Presets section
Gui, Add, GroupBox, x336 y144 w154 h220, Presets
Gui, Add, DropDownList, x342 y164 w142 h30 r30 vPresetChoice, Create new preset...||My save to picture set|My save to avi set|My save to ftp|My motion detection set
Gui, Add, Button, x342 y190 w70 h24 vSelectPresetB, Select
Gui, Add, Button, x414 y190 w70 h24 vNewPresetB, Edit
Gui, Add, Text, x342 y220 w142 h106 vPresetInfoT,
Gui, Add, Button, x342 y334 w70 h24 vRunPresetB, Run
Gui, Add, Button, x414 y334 w70 h24 vStopPresetB, Stop
*/
; --- Statusbar
Gui, Add, StatusBar,, Done
SB_SetIcon("shell32.dll", 222, 1)
; Get drivers
GoSub, RefreshDrivers
; Get handle of Gui
Gui +LastFound
hwndParent := WinExist()
; Show
Gui, Show, w500 h400, Video For Windows for AutoHotkey - VFW4AHK
;Gosub, ConnectToDriver
Return
PreviewToggle:
msgbox Only once!
; If PreviewToggleState
GoSub ConnectToDriver
; Else
; GoSub DisconnectDriver
Return
ConnectToDriver:
; --- Connect and preview
capHwnd := Cap_CreateCaptureWindow(hwndParent, 10, 124, 320, 240)
;ToolTip % errorlevel
WM_USER = 0x0400
WM_CAP_START := WM_USER
WM_CAP_GRAB_FRAME_NOSTOP := WM_USER + 61
WM_CAP_FILE_SAVEDIB := WM_CAP_START + 25
WM_CAP := 0x400
WM_CAP_DRIVER_CONNECT := WM_CAP + 10
WM_CAP_DRIVER_DISCONNECT := WM_CAP + 11
WM_CAP_EDIT_COPY := WM_CAP + 30
WM_CAP_SET_PREVIEW := WM_CAP + 50
WM_CAP_SET_PREVIEWRATE := WM_CAP + 52
WM_CAP_SET_SCALE := WM_CAP + 53
; Connect to driver
if SelectedDriver =
{
MsgBox, 16, Error!, You didn't select a video driver
Return
}
SendMessage, WM_CAP_DRIVER_CONNECT, %SelectedDriver%, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview scale
SendMessage, WM_CAP_SET_SCALE, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Set the preview rate in milliseconds
SendMessage, WM_CAP_SET_PREVIEWRATE, 66, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
; Start previewing the image from the camera
SendMessage, WM_CAP_SET_PREVIEW, 1, 0, , ahk_id %capHwnd%
;ToolTip % errorlevel
ToolTip
Return
CopyToClipBoard:
SendMessage, WM_CAP_EDIT_COPY, 0, 0, , ahk_id %capHwnd%
Return
SenToFile:
imagefile = C:\image.bmp
SendMessage, WM_CAP_FILE_SAVEDIB, 0, &imagefile, , ahk_id %capHwnd%
ToolTip % errorlevel
return
DisconnectDriver:
SendMessage, WM_CAP_DRIVER_DISCONNECT, 1, 0, , ahk_id %capHwnd%
Return
RefreshDrivers:
foundDriver = 0
LV_Delete()
Loop
{
thisInfo := Cap_GetDriverDescription(A_Index-1)
If thisInfo
{
foundDriver = 1
LV_Add("", A_Index-1, thisInfo)
}
Else
Break
}
If !foundDriver
{
LV_Delete()
LV_Add("", "", "Could not get video drivers")
GuiControl, Disable, CapDriversLV
GuiControl, Disable, SelectDriverB
}
Return
SelectDriver:
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
LV_GetText(SelectedDriver, FocusedRowNumber, 1)
Return
/*
'// The two functions exported by AVICap
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _
ByVal hWndParent As Long, ByVal nID As Long) As Long
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _
ByVal wDriver As Integer, _
ByVal lpszName As String, _
ByVal cbName As Long, _
ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean
*/
Cap_CreateCaptureWindow(hWndParent, x, y, w, h)
{
WS_CHILD := 0x40000000
WS_VISIBLE := 0x10000000
lpszWindowName := "test"
lwndC := DLLCall("avicap32.dll\capCreateCaptureWindowA"
, "Str", lpszWindowName
, "UInt", WS_VISIBLE | WS_CHILD ; dwStyle
, "Int", x
, "Int", y
, "Int", w
, "Int", h
, "UInt", hWndParent
, "Int", 0)
;msgbox % lwndC " | " errorlevel " | " lpszWindowName " | " hwndParent
Return lwndC
}
Cap_GetDriverDescription(wDriver)
{
VarSetCapacity(lpszName, 100)
VarSetCapacity(lpszVer, 100)
res := DLLCall("avicap32.dll\capGetDriverDescriptionA"
, "Short", wDriver
, "Str", lpszName
, "Int", 100
, "Str", lpszVer
, "Int", 100)
If res
capInfo := lpszName ; " | " lpszVer
Return capInfo
}
GuiClose:
GoSub, DisconnectDriver
DllCall("FreeLibrary", "str", hModule)
ExitApp
Return
!r::Reload ; for debugging |
Hope this helps _________________
 |
|
| Back to top |
|
 |
goldensoft
Joined: 23 Jul 2007 Posts: 11
|
Posted: Tue Jul 24, 2007 8:42 pm Post subject: |
|
|
Micahs the code that you created is just perfect, it seems that 3 days of frustrating work have finally ended. Just wants to tell You THANK YOU!
Now about the script anyone knows how to directly from the script we can save a jpeg webcam shot with quality of 20? I'm not referring to save first the bmp/dib image and then convert it to jpg. What I mean is convert it directly from an image variable (not clipboard) stored in the script to a jpeg file? |
|
| Back to top |
|
 |
Micahs
Joined: 01 Dec 2006 Posts: 413
|
Posted: Wed Jul 25, 2007 12:11 am Post subject: |
|
|
The quick and dirty way:
Use this util - kiu-clipsave
"WM_CAP_GRAB_FRAME_NOSTOP" captures the current frame to the clipboard and "kiu-clipsave" saves it as a jpg and png.
| Code: | SenToFile:
saveas = JPG ;or BMP
If(saveas = "JPG") ;save as jpg
{
SendMessage, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0, , ahk_id %capHwnd% ;copies to clipboard
RunWait, kiu-clipsave.exe ;copies from clipboard to file
}
Else ;save as bmp
{
imagefile = C:\image.bmp
SendMessage, WM_CAP_FILE_SAVEDIB, 0, &imagefile, , ahk_id %capHwnd%
ToolTip % errorlevel
}
return
|
Harder and slower way:
http://www.autohotkey.com/forum/viewtopic.php?t=11860
http://www.autohotkey.com/forum/viewtopic.php?t=12012
Figure out how to capture just the "ClsCapWin1" area and save that hdc to a jpg. _________________
 |
|
| Back to top |
|
 |
Micahs
Joined: 01 Dec 2006 Posts: 413
|
Posted: Wed Jul 25, 2007 1:38 am Post subject: |
|
|
Ok, I think I've got this one licked. Building on the work of PhiLho, daonlyfreez, and holomind, Here you go:
This captures the ClsCapWin1 (with the webcam script running) and saves it as a jpg. Here is the original.
You also need GDIPlusHelper.ahk. This is an amalgam by holomind of PhiLho's GDI stuff from here.
Have both scripts running and press win-v to create the image. It will be in the "screens" directory.
You will probably want to incorporate the relevant portions of this into the webcam script. Have fun!
| Code: | #Include GDIPlusHelper.ahk
; see: http://www.autohotkey.com/forum/viewtopic.php?t=11860 for orignal
capWidth = 320
capHeight = 240
OnExit, handle_exit
main:
FileCreateDir, screens
FileCreateDir, thumbs
;WinGet, hw_frame, id, "Program Manager" ; Desktop ?
ControlGet,hw_frame,Hwnd,,ClsCapWin1,Video For Windows for AutoHotkey - VFW4AHK
hdc_frame := DllCall( "GetDC", "uint", hw_frame )
hdc_frame_full := DllCall( "GetDC", "uint", hw_frame )
counter:=0 ; thumbnails
counter_f:=0 ; fullscreens
thumb_w:= 200
thumb_h:= ceil( thumb_w * capHeight / capWidth ) ; keep screenratio
use_antialize := 1
; buffer
hdc_buffer := DllCall( "gdi32.dll\CreateCompatibleDC" , "uint", hdc_frame )
hbm_buffer := DllCall( "gdi32.dll\CreateCompatibleBitmap" , "uint", hdc_frame, "int", thumb_w, "int", thumb_h )
r := DllCall( "gdi32.dll\SelectObject" , "uint", hdc_buffer, "uint", hbm_buffer )
hdc_buffer_full := DllCall( "gdi32.dll\CreateCompatibleDC" , "uint", hdc_frame_full )
hbm_buffer_full := DllCall( "gdi32.dll\CreateCompatibleBitmap" , "uint", hdc_frame_full, "int", capWidth, "int", capHeight )
r_full := DllCall( "gdi32.dll\SelectObject" , "uint", hdc_buffer_full, "uint", hbm_buffer_full )
; comment this line for speed but less quality
if use_antialize = 1
DllCall( "gdi32.dll\SetStretchBltMode", "uint", hdc_buffer, "int", 4 ) ; Halftone better quality with stretch
return
#c::
SaveImage:
counter := counter +1
FormatTime, myTime, , yyyyMMdd_hhmmss
fileNameDestP = thumbs\T_%myTime%_%counter%_%thumb_w%x%thumb_h%.jpg
If (GDIplus_Start() != 0)
Goto GDIplusError
; Copy BMP from DC
DllCall( "gdi32.dll\StretchBlt"
, "uint", hdc_buffer, "int", 0, "int", 0, "int", thumb_w, "int", thumb_h
, "uint", hdc_frame, "int", 0, "int", 0, "int", capWidth, "int", capHeight, "uint", 0x00CC0020 )
DllCall( "GDIplus\GdipCreateBitmapFromHBITMAP", uint, hbm_buffer, uint, 0, uintp, bitmap )
; Save to PNG
;If (GDIplus_GetEncoderCLSID(pngEncoder, #GDIplus_mimeType_png) != 0)
If (GDIplus_GetEncoderCLSID(jpgEncoder, #GDIplus_mimeType_jpg) != 0)
Goto GDIplusError
noParams = NONE
;If (GDIplus_SaveImage(bitmap, fileNameDestP, pngEncoder, noParams) != 0)
If (GDIplus_SaveImage(bitmap, fileNameDestP, jpgEncoder, noParams) != 0)
Goto GDIplusError
Gosub GDIplusStop
Return
#v::
SaveImage_Full:
counter_f := counter_f +1
FormatTime, myTime, , yyyyMMdd_hhmmss
fileNameDestP = screens\S_%myTime%_%counter_f%_%capWidth%x%capHeight%.jpg
If (GDIplus_Start() != 0)
Goto GDIplusError
; Copy BMP from DC
DllCall( "gdi32.dll\BitBlt"
, "uint", hdc_buffer_full, "int", 0, "int", 0, "int", capWidth, "int", capHeight
, "uint", hdc_frame_full, "int", 0, "int", 0, "uint", 0x00CC0020 )
DllCall( "GDIplus\GdipCreateBitmapFromHBITMAP", uint, hbm_buffer_full, uint, 0, uintp, bitmap )
; Save to JPG
If (GDIplus_GetEncoderCLSID(jpgEncoder, #GDIplus_mimeType_jpg) != 0)
Goto GDIplusError
noParams = NONE
If (GDIplus_SaveImage(bitmap, fileNameDestP, jpgEncoder, noParams) != 0)
Goto GDIplusError
Gosub GDIplusStop
Return
GDIplusError:
GDIplusStop:
If (#GDIplus_lastError != "")
MsgBox 16, GDIplus Test, Error in %#GDIplus_lastError%
GDIplus_Stop()
Return
#x::
handle_exit:
DllCall( "gdi32.dll\DeleteObject", "uint", hbm_buffer )
DllCall( "gdi32.dll\DeleteDC" , "uint", hdc_frame )
DllCall( "gdi32.dll\DeleteDC" , "uint", hdc_buffer )
ExitApp
|
Oh, you'll have to look at the options of the GDIPlus script to change the quality of the final jpg. _________________
 |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|