Hallo,
ich habe mich seit einigen Tagen mit dem Tutorial dieser Webseite zum anzeigen einer Webcam in einer Picturebox beschäftigt:
http://www.vbarchiv.net/archiv/tipp_744.html
Das Video wird wie folgt in einer Picturebox angezeigt:
videoHandle = CreateCaptureWindow(picture1.hWnd, 0, 0, videoWidth, videoHeight, _
0) Wenn ich den Inhalt der Picturebox (picture1) in der das Video der Webcam angezeigt wird in eine andere Picturebox kopiere, dann ist dieser leer. picture2.picture = picture1.picture.
Um ein Bild aus einer Picturebox auszulesen und in einem Bytearray zu speichern benutze ich foglende Funktion. Diese Funktioniert aber nur mit einem Bild das über picture.picture ansprechabr ist. Nicht direkt mit dem Videohandle der Webcam.
Function ReadData(pic As IPicture, abp As asmBmpPara, src() As Byte, tgt() As _
Byte, Optional pmd As Boolean = True, Optional eMD As Boolean = True) As _
Boolean
' infos über das einzulesende Bild
Dim bmp As BITMAP
' erweiterte infos über das einzulesende Bild
Dim bmi As BITMAPINFO
' Gerätekontext-Handle
Dim hdc As Long
' Zeiger auf die binären Bilddaten
Dim ptr As Long
Dim tmp As Long
' Einlesen der Bitmapinfos
If GetObject(pic.Handle, Len(bmp), bmp) = 0 Then
If eMD Then MsgBox "Bildinformationen konnten nicht gelesen werden"
ElseIf pmd = True And bmp.bmBits <> 0 And bmp.bmBitsPixel = 32 Then
' wenn die Daten im richtigen Format vorliegen, diesen Pointer nehmen
ptr = bmp.bmBits
Else
' sonst per GDI-Funktion konvertieren lassen und im tgt-bArray()
' speichern
With bmi.bmiHeader
.biSize = Len(bmi.bmiHeader)
.biCompression = BI_RGB
.biHeight = bmp.bmHeight
.biWidth = bmp.bmWidth
.biPlanes = 1
.biBitCount = 32
.biSizeImage = .biWidth * 4 * .biHeight
' Array neu dimensionieren
ReDim tgt(1 To .biWidth * 4, 1 To .biHeight)
hdc = GetDC(0)
If hdc = 0 Then
If eMD Then MsgBox "Gerätekontext konnte nicht erzeugt werden"
ElseIf GetDIBits(hdc, pic.Handle, 0, .biHeight, tgt(1, 1), bmi, _
DIB_RGB_COLORS) Then
ptr = VarPtr(tgt(1, 1))
Else
' bei Fehler: tgt-bArray wieder auf usrprüngliche Dimension
' setzen
ReDim tgt(1 To UBound(src, 1), 1 To UBound(src, 2))
If eMD Then MsgBox "Bilddaten konnten nicht gelesen werden"
End If
' gibt den Gerätekontext [DC] wieder frei, so daß andere
' Anwendungen ihn wieder verwenden können
If hdc Then ReleaseDC 0, hdc
End With
End If
If ptr Then
bmp.bmBitsPixel = 32
bmp.bmWidthBytes = bmp.bmWidth * 4
tmp = bmp.bmWidthBytes * bmp.bmHeight
' src-bArray dimensionieren und mit Bilddaten füllen
ReDim src(1 To bmp.bmWidthBytes, 1 To bmp.bmHeight)
' Kopiert an die Position der Zieladresse die mit der Adresse
' identifizierte Quelle
' Der drite Parameter gibt die Anzahl der bytes an die kopiert werden
CopyMemory src(1, 1), ByVal ptr, tmp
'asmBmpPara-Struktur setzen
abp.src = bmp
abp.src.bmBits = VarPtr(src(1, 1))
abp.tgt = bmp
abp.tgt.bmBits = ptr
ReadData = True
End If
End Function Wie bekomme ich das Bild in das Array ohne es zuvor in eine Picturebox (picture2) zu kopieren.
Wie kann ich das Array in eine ganz normale picturebox zurück schreiben?
Bitte helft mir, ich hab mir daran schon die Zähne ausgebissen.
Wenn ich den ganzen Code posten soll, dann sagt bescheid
Gruß Bastel |