Hallo zusammen,
um ein Webcambild in eine Picturebox zu machen benutze ich folgenden code:
Das funktioniert auch, aber nur sehr "ruckelig".
Auch wenn ich bei "SendMessage(previewHandle, WM_CAP_SET_PREVIEWRATE, 30, 0)" die framerate mit eineranderen Zahl ersetze z.B. 60 funktioniert es auch nicht
an der geschwindigkeit der Kamera kann es glaube ich auch nicht liegen, denn ich hab sowohl eine Webcam als auch einen Camcorder mit Firewire angeschlossen.
Perfekt wäre es, wenn es genauso flüssig liefe wie wenn man im XP Arbeitsplatz auf die Kamera klickt.
Nun zu meiner frage:
kennt jemand von euch eine klasse oder einen anderen code mit dem das schneller geht?
Danke für Antworten im Vorraus
rahu2000
um ein Webcambild in eine Picturebox zu machen benutze ich folgenden code:
VB.NET-Quellcode
- Public Class Form1
- Public videoHandle As IntPtr
- Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
- Const EM_LINEFROMCHAR As Integer = &HC9
- Const EM_LINEINDEX As Integer = &HBB
- Private Declare Auto Function capCreateCaptureWindow Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, ByVal nID As Integer) As IntPtr
- Private Const WS_CHILD As Integer = &H40000000
- Private Const WS_VISIBLE As Integer = &H10000000
- Private Const WM_USER As Short = &H400S
- Private Const WM_CAP_START As Short = &H400S
- Private Const WM_CAP_EDIT_COPY As Integer = (WM_CAP_START + 30)
- Private Const WM_CAP_DRIVER_CONNECT As Integer = (WM_CAP_START + 10)
- Private Const WM_CAP_SET_PREVIEWRATE As Integer = (WM_CAP_START + 52)
- Private Const WM_CAP_SET_OVERLAY As Integer = (WM_CAP_START + 51)
- Private Const WM_CAP_SET_PREVIEW As Integer = (WM_CAP_START + 50)
- Private Const WM_CAP_DRIVER_DISCONNECT As Integer = (WM_CAP_START + 11)
- Public Function CreateCaptureWindow(ByRef hWndParent As IntPtr, Optional ByRef x As Integer = 0, Optional ByRef y As Integer = 0, Optional ByRef nWidth As Integer = 320, Optional ByRef nHeight As Integer = 240, Optional ByRef nCameraID As Integer = 0) As IntPtr
- Dim previewHandle As IntPtr
- previewHandle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, x, y, nWidth, nHeight, hWndParent, 1)
- SendMessage(previewHandle, WM_CAP_DRIVER_CONNECT, nCameraID, 0)
- SendMessage(previewHandle, WM_CAP_SET_PREVIEWRATE, 30, 0)
- SendMessage(previewHandle, WM_CAP_SET_OVERLAY, 1, 0)
- SendMessage(previewHandle, WM_CAP_SET_PREVIEW, 1, 0)
- Return previewHandle
- End Function
- Public Function CapturePicture(ByRef nCaptureHandle As IntPtr) As System.Drawing.Image
- My.Computer.Clipboard.Clear()
- SendMessage(nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0)
- Return My.Computer.Clipboard.GetImage
- End Function
- Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- videoHandle = Me.CreateCaptureWindow(Me.PictureBox1.Handle, , , 320, 240)
- PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage
- End Sub
- End Class
Das funktioniert auch, aber nur sehr "ruckelig".
Auch wenn ich bei "SendMessage(previewHandle, WM_CAP_SET_PREVIEWRATE, 30, 0)" die framerate mit eineranderen Zahl ersetze z.B. 60 funktioniert es auch nicht
an der geschwindigkeit der Kamera kann es glaube ich auch nicht liegen, denn ich hab sowohl eine Webcam als auch einen Camcorder mit Firewire angeschlossen.
Perfekt wäre es, wenn es genauso flüssig liefe wie wenn man im XP Arbeitsplatz auf die Kamera klickt.
Nun zu meiner frage:
kennt jemand von euch eine klasse oder einen anderen code mit dem das schneller geht?
Danke für Antworten im Vorraus
rahu2000