从相机捕获图像并保存
Capture image from camera and save it
我想在我的表单(MS Access 数据库)中添加一个按钮,以便它可以从我的相机(笔记本电脑)捕获图像并将其保存在特定位置(c:\image)。
我正在使用 windows 10 和 office 2010 或 office 365。
使用 WIA 的代码:
Private Sub Command1_Click()
Dim oWIA_DeviceManager As WIA.DeviceManager
Dim oWIA_Device As WIA.Device
Dim oWIA_ComDlg As WIA.CommonDialog
Dim oImageFile As WIA.ImageFile
Dim i As Long
Set oWIA_DeviceManager = New WIA.DeviceManager
If oWIA_DeviceManager.DeviceInfos.Count > 0 Then
Set oWIA_ComDlg = New WIA.CommonDialog
' Index the Devices property starting here at 1, not 0 .
For i = 1 To oWIA_DeviceManager.DeviceInfos.Count
Set oWIA_Device = oWIA_DeviceManager.DeviceInfos.Item(i).Connect
' Use this to show Acquisition CommonDialog
Set oImageFile = oWIA_ComDlg.ShowAcquireImage
' Use this to show Acquisition Wizard
'Set oImageFile = oWIA_ComDlg.ShowAcquisitionWizard(oWIA_Device)
Next i
Else
MsgBox "No WIA compatible device attached!"
End If
End Sub
用这个打开我的 iPhone 相机(USB 连接)。我需要使用笔记本电脑的内置摄像头。
这个页面可能就是您所需要的。
http://www.developerfusion.com/thread/46191/how-to-capture-picture-using-webcam-in-vb60/
'******************* module code **************
Public Const WS_CHILD As Long = &H40000000
Public Const WS_VISIBLE As Long = &H10000000
Public Const WM_USER As Long = &H400
Public Const WM_CAP_START As Long = WM_USER
Public Const WM_CAP_DRIVER_CONNECT As Long = WM_CAP_START + 10
Public Const WM_CAP_DRIVER_DISCONNECT As Long = WM_CAP_START + 11
Public Const WM_CAP_SET_PREVIEW As Long = WM_CAP_START + 50
Public Const WM_CAP_SET_PREVIEWRATE As Long = WM_CAP_START + 52
Public Const WM_CAP_DLG_VIDEOFORMAT As Long = WM_CAP_START + 41
Public Const WM_CAP_FILE_SAVEDIB As Long = WM_CAP_START + 25
Public Declare Function capCreateCaptureWindow _
Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
(ByVal lpszWindowName As String, ByVal dwStyle As Long _
, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long _
, ByVal nHeight As Long, ByVal hwndParent As Long _
, ByVal nID As Long) As Long
Public Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long _
, ByVal wParam As Long, ByRef lParam As Any) As Long
'************* end of module code ******************
Add the following controls in a form
1. A picture box with name "PicWebCam"
2. A commondialog control with name "CDialog"
3. Add 4 command buttons with name "cmd1","cmd2,"cmd3","cmd4"
then paste the following code
'************************** Code **************
Dim hCap As Long
Private Sub cmd4_Click()
Dim sFileName As String
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(False), 0&)
With CDialog
.CancelError = True
.Flags = cdlOFNPathMustExist Or cdlOFNOverwritePrompt
.Filter = "Bitmap Picture(*.bmp)|*.bmp|JPEG Picture(*.jpg)|*.jpg|All Files|*.*"
.ShowSave
sFileName = .FileName
End With
Call SendMessage(hCap, WM_CAP_FILE_SAVEDIB, 0&, ByVal CStr(sFileName))
DoFinally:
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End Sub
Private Sub Cmd3_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
End Sub
Private Sub Cmd1_Click()
hCap = capCreateCaptureWindow("Take a Camera Shot", WS_CHILD Or WS_VISIBLE, 0, 0, PicWebCam.Width, PicWebCam.Height, PicWebCam.hWnd, 0)
If hCap <> 0 Then
Call SendMessage(hCap, WM_CAP_DRIVER_CONNECT, 0, 0)
Call SendMessage(hCap, WM_CAP_SET_PREVIEWRATE, 66, 0&)
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End If
End Sub
Private Sub Cmd2_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
End Sub
Private Sub Form_Load()
cmd1.Caption = "Start &Cam"
cmd2.Caption = "&Format Cam"
cmd3.Caption = "&Close Cam"
cmd4.Caption = "&Save Image"
End Sub
'**************** Code end ************************
基本上这是在使用 windows 消息泵向网络摄像头驱动程序发送消息,要求它拍照。
此外,还有一个关于未来自助的小贴士。通过搜索 VB6 通常可以获得更好的结果,这几乎与 VBA 完全相同。 VBA只是少了几个功能。
如果你缺少通用对话框控件。你可以把代码改成这样
Private Sub cmd4_Click()
Dim sFileName As String
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(False), 0&)
sFileName="C:\PathToNewImageFile.bmp"
Call SendMessage(hCap, WM_CAP_FILE_SAVEDIB, 0&, ByVal CStr(sFileName))
DoFinally:
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End Sub
过去我使用 WIA(Microsoft Windows Image Acquisition)扫描仪,但它适用于网络摄像头。我一定会试试的。
我想在我的表单(MS Access 数据库)中添加一个按钮,以便它可以从我的相机(笔记本电脑)捕获图像并将其保存在特定位置(c:\image)。
我正在使用 windows 10 和 office 2010 或 office 365。
使用 WIA 的代码:
Private Sub Command1_Click()
Dim oWIA_DeviceManager As WIA.DeviceManager
Dim oWIA_Device As WIA.Device
Dim oWIA_ComDlg As WIA.CommonDialog
Dim oImageFile As WIA.ImageFile
Dim i As Long
Set oWIA_DeviceManager = New WIA.DeviceManager
If oWIA_DeviceManager.DeviceInfos.Count > 0 Then
Set oWIA_ComDlg = New WIA.CommonDialog
' Index the Devices property starting here at 1, not 0 .
For i = 1 To oWIA_DeviceManager.DeviceInfos.Count
Set oWIA_Device = oWIA_DeviceManager.DeviceInfos.Item(i).Connect
' Use this to show Acquisition CommonDialog
Set oImageFile = oWIA_ComDlg.ShowAcquireImage
' Use this to show Acquisition Wizard
'Set oImageFile = oWIA_ComDlg.ShowAcquisitionWizard(oWIA_Device)
Next i
Else
MsgBox "No WIA compatible device attached!"
End If
End Sub
用这个打开我的 iPhone 相机(USB 连接)。我需要使用笔记本电脑的内置摄像头。
这个页面可能就是您所需要的。 http://www.developerfusion.com/thread/46191/how-to-capture-picture-using-webcam-in-vb60/
'******************* module code **************
Public Const WS_CHILD As Long = &H40000000
Public Const WS_VISIBLE As Long = &H10000000
Public Const WM_USER As Long = &H400
Public Const WM_CAP_START As Long = WM_USER
Public Const WM_CAP_DRIVER_CONNECT As Long = WM_CAP_START + 10
Public Const WM_CAP_DRIVER_DISCONNECT As Long = WM_CAP_START + 11
Public Const WM_CAP_SET_PREVIEW As Long = WM_CAP_START + 50
Public Const WM_CAP_SET_PREVIEWRATE As Long = WM_CAP_START + 52
Public Const WM_CAP_DLG_VIDEOFORMAT As Long = WM_CAP_START + 41
Public Const WM_CAP_FILE_SAVEDIB As Long = WM_CAP_START + 25
Public Declare Function capCreateCaptureWindow _
Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
(ByVal lpszWindowName As String, ByVal dwStyle As Long _
, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long _
, ByVal nHeight As Long, ByVal hwndParent As Long _
, ByVal nID As Long) As Long
Public Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long _
, ByVal wParam As Long, ByRef lParam As Any) As Long
'************* end of module code ******************
Add the following controls in a form
1. A picture box with name "PicWebCam"
2. A commondialog control with name "CDialog"
3. Add 4 command buttons with name "cmd1","cmd2,"cmd3","cmd4"
then paste the following code
'************************** Code **************
Dim hCap As Long
Private Sub cmd4_Click()
Dim sFileName As String
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(False), 0&)
With CDialog
.CancelError = True
.Flags = cdlOFNPathMustExist Or cdlOFNOverwritePrompt
.Filter = "Bitmap Picture(*.bmp)|*.bmp|JPEG Picture(*.jpg)|*.jpg|All Files|*.*"
.ShowSave
sFileName = .FileName
End With
Call SendMessage(hCap, WM_CAP_FILE_SAVEDIB, 0&, ByVal CStr(sFileName))
DoFinally:
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End Sub
Private Sub Cmd3_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
End Sub
Private Sub Cmd1_Click()
hCap = capCreateCaptureWindow("Take a Camera Shot", WS_CHILD Or WS_VISIBLE, 0, 0, PicWebCam.Width, PicWebCam.Height, PicWebCam.hWnd, 0)
If hCap <> 0 Then
Call SendMessage(hCap, WM_CAP_DRIVER_CONNECT, 0, 0)
Call SendMessage(hCap, WM_CAP_SET_PREVIEWRATE, 66, 0&)
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End If
End Sub
Private Sub Cmd2_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
End Sub
Private Sub Form_Load()
cmd1.Caption = "Start &Cam"
cmd2.Caption = "&Format Cam"
cmd3.Caption = "&Close Cam"
cmd4.Caption = "&Save Image"
End Sub
'**************** Code end ************************
基本上这是在使用 windows 消息泵向网络摄像头驱动程序发送消息,要求它拍照。 此外,还有一个关于未来自助的小贴士。通过搜索 VB6 通常可以获得更好的结果,这几乎与 VBA 完全相同。 VBA只是少了几个功能。
如果你缺少通用对话框控件。你可以把代码改成这样
Private Sub cmd4_Click()
Dim sFileName As String
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(False), 0&)
sFileName="C:\PathToNewImageFile.bmp"
Call SendMessage(hCap, WM_CAP_FILE_SAVEDIB, 0&, ByVal CStr(sFileName))
DoFinally:
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End Sub
过去我使用 WIA(Microsoft Windows Image Acquisition)扫描仪,但它适用于网络摄像头。我一定会试试的。