000
20.10.2006, 13:07 Uhr
Schmuech
|
Hallo,
ich arbeite mit einer Klasse zur Aufname eines Webcam-Bildes aus dem Internet. Die Aufnahme funktioniert mit WinAPI und VfW. Leider wird die Aufnahme gestoppt, sobald ich das Formular, im welcher das Bild angezeigt wird minimiere oder ein anderes Programm in den Vordergrund hole. Von dem angezeigtem Bild wird alle 10 Sekunden ein Bitmap gespeichert. Ist es möglich, diese Bildaufnahme auch durchzuführen, wenn das Formular der Webcam nicht den aktuellen Fokus hat?
Hier der Quelltext der Klasse:
Code: |
#include <vcl.h> #pragma hdrstop
#include <stdio.h> #include "c_cap.h" #include "Unit6.h" #include "Unit1.h"
//--------------------------------------------------------------------------- #pragma package(smart_init)
__fastcall TCap::TCap (HWND Handle) { // create video capture window ParentHandle = Handle; hwndVideo = capCreateCaptureWindow( (LPSTR) "My Capture Window", WS_CHILD | WS_VISIBLE, 0, 0, 300, 200, (HWND) Handle, (int) 1);
pStringCapDrivers = new TStringList; SelectedDevice = -1; }
__fastcall TCap::~TCap () {
delete pStringCapDrivers;
capCaptureStop(hwndVideo); capPreview(hwndVideo, FALSE); // end preview capDriverConnect(hwndVideo, SelectedDevice); capDriverDisconnect(hwndVideo); // disconnect from driver capCaptureAbort(hwndVideo); }
//--------------------------------------------------------------------------- // enumerate the installed capture drivers //--------------------------------------------------------------------------- int TCap::EnumCapDrv () { char szDeviceName[80]; // driver name char szDeviceVersion[80]; // driver version char str[161]; // concatinated string int xcap; // counter
xcap = 0; pStringCapDrivers->Clear (); do { if (capGetDriverDescription(xcap, szDeviceName, sizeof(szDeviceName), szDeviceVersion, sizeof(szDeviceVersion))) { sprintf (str, "%s, %s", szDeviceName, szDeviceVersion); pStringCapDrivers->AddObject (str, (TObject *)xcap); } else { break; } xcap++; } while (true);
return 0; }
//--------------------------------------------------------------------------- // connecting to selected device and starts preview //--------------------------------------------------------------------------- void TCap::Connect (int Selected) { CAPSTATUS CapStatus; int hsize;
// verbindet sich zum Treiber if (SelectedDevice != -1) { capPreview (hwndVideo, FALSE); capDriverConnect(hwndVideo, SelectedDevice); }
if (!capDriverConnect(hwndVideo, Selected)) { // Wenn keine Verbindung möglich -> Abbruch return; }
// Die Treibereigenschaften werden neu geladen capDriverGetCaps (hwndVideo, sizeof(CAPDRIVERCAPS), &CapDrvCaps);
capDlgVideoFormat(ParentHandle);
//-----------------------------------------------------------------------------
//**********Eigene Veränderungen an dem Header********************************* //----------------------------------------------------------------------------- //Die Standarteinstellungen laden DWORD dwSize; // Länge der Formateigenschaften BITMAPINFO pbiInfo; // Bitmap-Eigenschaften der Datei
dwSize=capGetVideoFormatSize(hwndVideo); // Messen der Länge
capGetVideoFormat(hwndVideo, &pbiInfo, dwSize); // Momentane Formatierung laden
// Einstellen der neuen Werte DWORD dwWidth,dwHeight,dwBPP;
dwWidth=HOR; // Horizontale Auflösung dwHeight=VER; // Vertikale Auflösung dwBPP=24; // Farbtiefe
pbiInfo.bmiHeader.biWidth = dwWidth; pbiInfo.bmiHeader.biHeight = dwHeight; pbiInfo.bmiHeader.biBitCount = (WORD) dwBPP;
pbiInfo.bmiHeader.biSizeImage = 0; // Größe der reservierten Bytes pbiInfo.bmiHeader.biCompression = BI_RGB; // Komprimierung (BI_RGB=keine Kompr.) pbiInfo.bmiHeader.biClrUsed = 0; // Maximale Anzahl der dargestellten pbiInfo.bmiHeader.biClrImportant = 0; // Farben, 0=alle Farben pbiInfo.bmiHeader.biPlanes = 1; // Einstellung der Treiberebenen. Muss 1 sein
pbiInfo.bmiColors->rgbBlue = 0; // Eingabe der Farbverstärkung der pbiInfo.bmiColors->rgbGreen = 0; // Grundfarben. 0=keine Verstärkung pbiInfo.bmiColors->rgbRed = 0; pbiInfo.bmiColors->rgbReserved = 0; // Muss auf 0 gesetzt sein
//Zurückschreiben zur API capSetVideoFormat(hwndVideo, &pbiInfo, dwSize); //-----------------------------------------------------------------------------
// Die neu eingestellte Bildgröße wird in den CapStatus geladen capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
hsize = GetSystemMetrics(SM_CYMENU); hsize += GetSystemMetrics(SM_CYCAPTION);
// Das Anzeigefenster wird neu aufgebaut SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth, CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE); SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth, CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE);
// Stellt die Bildwiederholrate des Vorschaufensters ein capPreviewRate (hwndVideo, 33.3);
// startet die Bildvorschau capPreview (hwndVideo, TRUE);
// Das geöffnete Aufnahmegerät wird gespeichert SelectedDevice = Selected;
}
//--------------------------------------------------------------------------- // Get access to the video source format box //--------------------------------------------------------------------------- void TCap::Format () { int hsize;
CAPSTATUS CapStatus;
capDlgVideoFormat(hwndVideo); // Are there new image dimensions capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
hsize = GetSystemMetrics(SM_CYMENU); hsize += GetSystemMetrics(SM_CYCAPTION);
SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth, CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE); SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth, CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE); }
//--------------------------------------------------------------------------- // Get access to the video source dialog box //--------------------------------------------------------------------------- void TCap::Source () { capDlgVideoSource(hwndVideo); }
//--------------------------------------------------------------------------- // capture a frame and save it //--------------------------------------------------------------------------- void TCap::CaptureFrame (char *FileName) { capFileSaveDIB (hwndVideo, FileName); } //---------------------------------------------------------------------------
|
|