![]() |
Webcam in Delphi?
Ich würde gerne in meinem Programm ein livebild meiner Webcam anzeigen und bei Bedarf ein "Foto" schießen!
Der einzige hinweis, den ich hier in der DP gesehen habe ist das DS-Pack, allerdings lässt es sich bei mir nicht installieren (kann aber auch daran liegen, dass ich zu doof dazu bin. Wie muss ich das den Installieren?)! Gibt es da noch eine Alternative zum DSPack? Am liebsten wäre mir auch eine Komponente, damit das ganze nicht zu kompliziert wird! Vielen Dank Nicolai |
Re: Webcam in Delphi?
|
Re: Webcam in Delphi?
Du brauchst das DSPack gar nicht.
Ich habs nach einer im Forum des SDC geposteten Lösung gemacht, und es funktioniert.
Delphi-Quellcode:
//Zuerst brauchst du folgende Konstanten
const WM_CAP_DRIVER_CONNECT = WM_USER + 10; WM_CAP_EDIT_COPY = WM_USER + 30; WM_CAP_SET_PREVIEW = WM_USER + 50; WM_CAP_SET_OVERLAY = WM_USER + 51; WM_CAP_SET_PREVIEWRATE = WM_USER + 52; implementation {$R *.dfm} //Dann brauchst du noch das hier function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TForm1.LaberLaber; //halt irgendne Prozedur, ich habs im Formcreate, damit ich gleich was seh ^^ var handle:THandle; begin handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 320, 240, Panel1.Handle, 1); //Wie du siehst, brauchst du ein Panel in diesem Beispiel ;-) SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 30, 0); sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(handle, wm_cap_set_preview, 1, 0); end; Getestet hab ich den Code mit meiner Eyetoy-Kamera mit modifizierten treibern, sollte aber mit jeder anderen Webcam auch funktionieren :-) |
Re: Webcam in Delphi?
Zitat:
@Ultimator: Danke, aber muss man irgendwo noch die "Inputgröße" der Kamra einstellen? Bleiben die Konstanten immer gleich oder muss ich die für meine Bedürfnisse ändern? Wie mache ich damit ein Foto? |
Re: Webcam in Delphi?
Also, in dem Beitrag im o.g. Forum hat er noch den Code für ein Bildschirmfoto gepostet, aber den hab ich nicht getestet :mrgreen:
Delphi-Quellcode:
Dan müsstest du halt die im oben genannten Code vereinbarte Variable handle global oder so machen, um darauf zugreifen zu können.
procedure TForm1.ButtonCamFoClick(Sender:TObkect);
begin SendMessage( handle, WM_CAP_EDIT_COPY, 1, 0 ); Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); end; Joa, die Konstanten der Funktion capCreateCaptureWindow müssen gleich bleiben; in diesem Codeblock
Delphi-Quellcode:
kannst/darfst du lediglich das 'Video' in handle:= capCreateWindow(bla); ändern.
handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 320, 240, Panel1.Handle, 1);
SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 30, 0); sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(handle, wm_cap_set_preview, 1, 0); Die Konstanten WM_CAP_DRIVER_CONNECT, WM_CAP_SET_PREVIEWRATE, WM_CAP_SET_OVERLAY und wm_cap_set_preview müssen denke ich so bleiben. Kannst ja n bissl mit den Parametern rumspielen :mrgreen: Das dürfte erstmal alles sein :-) |
Re: Webcam in Delphi?
Gibt es noch die Möglichkeit einen Weißabgleich und die Helligkeit manuell einzustellen?
|
Re: Webcam in Delphi?
Vieleicht hilft dir auch noch
![]() |
Re: Webcam in Delphi?
Hi Ulti,
ich habe diesen Code ausprobiert:
Delphi-Quellcode:
und er funktioniert soweit auch gut :firejump:
procedure TForm1.ButtonCamFoClick(Sender:TObkect);
begin SendMessage( handle, WM_CAP_EDIT_COPY, 1, 0 ); Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); end; Allerdings wird das Bild in die Zwischenablage kopiert, was ich definitiv verhindern möchte. Gibt es eine Möglichkeit dies zu umgehn bzw. den ursprünglichen Zustand des Clipboards zu sichern und anschließend wieder herzustellen? Greetz alcaeus |
Re: Webcam in Delphi?
Zitat:
|
Re: Webcam in Delphi?
@Nicolai: Hast du die Unit ClipBrd eingebunden?
@Den Rest :-) Es gibt anscheinend auch die Möglichkeit, das ganze per API-Funktionen zu erledigen, anstatt per Messages. Beispiel:
Delphi-Quellcode:
Allerdings mosert da Delphi, dass capEditCopy ein undefinierter Bezeichner sei.
SendMessage( handle, WM_CAP_EDIT_COPY, 1, 0 ); //Das wäre jetzt per Message
capEditCopy(handle); //Müsste theoretisch auch gehen, macht das gleiche (erzählt mir zumindest das WinAPI-SDK :-) Weiß jemand, welche Unit da noch einzubinden ist? :gruebel: Dann müsste man nämlich nicht diese ganzen Konstanten oben definieren, von denen ich nicht weiß, wie sie zustande kommen :-? Zum Thema Bild in die Zwischenablage hab ich hier noch ein paar messages gefunden: WM_CAP_FILE_SAVEDIB ("The WM_CAP_FILE_SAVEDIB message copies the current frame to a DIB file.") WM_CAP_FILE_SAVEAS ("The WM_CAP_FILE_SAVEAS message copies the contents of the capture file to another file.") WM_CAP_FILE_SET_CAPTURE_FILE ("The WM_CAP_FILE_SET_CAPTURE_FILE message names the file used for video capture.") WM_CAP_FILE_ALLOCATE ("The WM_CAP_FILE_ALLOCATE message creates (preallocates) a capture file of a specified size.") Und nun noch zum Thema Benutzereinstellungen wegen Kostrast und so: WM_CAP_DLG_VIDEODISPLAY ("The WM_CAP_DLG_VIDEODISPLAY message displays a dialog box in which the user can set or adjust the video output. This dialog box might contain controls that affect the hue, contrast, and brightness of the displayed image, as well as key color alignment.") Und bei jeder dieser Messages steht hinter dem kurzen Beschreibungstext " You can send this message explicitly or by using the [Messagename ohne Unterstriche und vorangestelltes WM] macro." So, ich hoffe, ich konnte einigermaßen helfen :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz