![]() |
Bild von der Webcam festhalten?
Hi :hi:,
da ich die Webcam per Oerlay auf einem Panel anzeigen lasse, weiß ich nicht, wie ich ein Bild per Knopfdruck einem Image zuweisen soll. Kann mir vielleicht jemand helfen? Die Procedure zum Webcam anzeigen:
Delphi-Quellcode:
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 uses Info; {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TfrmMain.FormCreate; var handle:THandle; begin 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, 1, 0); sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(handle, wm_cap_set_preview, 1, 0); end; |
Re: Bild von der Webcam festhalten?
![]() |
Re: Bild von der Webcam festhalten?
Danke. Ich habe es mir mal durchgelesen und habe VERSUCHT :stupid: den Code zu verstehen.
Es wäre für mich das Sinnloseste, jetzt den Code bei mir reinzukopieren. Deshalb suche ich nur die Procedure, wo du das Bild machst. Ohne komprimieren, etc. Wie kann ich jetzt also das Bild einfach einem Image zufügen? |
Re: Bild von der Webcam festhalten?
Soweit ich den Quelltext überflogen hab werden die Bitmaps in der FormCreate-Prozedur erstellt. Guck doch einfach mal den Code durch, ist doch alles wunderbar kommentiert.
|
Re: Bild von der Webcam festhalten?
Soweit bin ich ja auch, dass in der FormCreate die Webcam angezeigt wird. Jetzt möchte ich aber auf Knopfdruck das Bild einem Image zuweisen. Und das kann ja schlecht OnCreate pasieren, sondern eher OnButton1.Click passieren.
|
Re: Bild von der Webcam festhalten?
Zitat:
Wenn du das in einer OnButton1.Click-Routine auslösen möchtest, dann kopiere doch einfach den Code der Timer1Timer-Procedure in diese OnClick-Proc rüber. Anschließen lädst du dann in der Callback-Funktion mittels dieser Zeile
Delphi-Quellcode:
das FBitmap in ein Image.
Image1.Picture.Bitmap.Assign(form1.FBitmap);
Alternativ gäbe es sonst höchstens noch die Methode, das Ganze übers Clipboard abzuwickeln ( ![]() |
Re: Bild von der Webcam festhalten?
Also. Ich habe es versucht, aber ich kriege es nicht hin. Jetzt habe ich mir Folgendes überlegt.
Ich rechne anhand der Größe der Form und anhand der position des panels, etc den bereich aus, und mache davon einen screenshot. wie mache ich nen screenshot von nem bestimmten bereich und füge es einem imae zu. aber wie mache ich einen sreenshot mit den angaben height, width, top, left? |
Re: Bild von der Webcam festhalten?
Die Idee ist richtig mieß! Wenn das ganze mit Overlay arbeitet fehlt auf manchen Systemen bei dem Screenshot dann nämlich das Overlay-bild und man sieht auf dem Screenshot nur eine schwarze fläche.
|
Re: Bild von der Webcam festhalten?
Okay, dann will ich es so machen, wie ich es kann :mrgreen:.
Delphi-Quellcode:
Das ganze funktioniert ja per Overlay und Panel. WEnn man das ganze umändern würde, dass es im TImage angezeigt wird, könnte ich es programmieren. Kann man das auf ein Image ändern, wenn ja, wie?
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 uses Info; {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TfrmMain.FormCreate; var handle:THandle; begin 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, 1, 0); sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(handle, wm_cap_set_preview, 1, 0); end; |
Re: Bild von der Webcam festhalten?
Ich weiß nicht ob man so ein Control, welches man da als Leinwand für die WebCam-Pics anbietet, danach noch sonderlich anders nutzen kann. Jedenfalls brauchst du dafür ein Control, was auch selbst wieder ein Handle hat (also immer eines ab TWinControl nehme ich an). Das müsstest du dann jeweils anstelle von Panel1.handle in diese capCreateCaptureWindow-Zeile einbauen. Ein TImage hat allerdings kein solches Handle.
Aber wie schon oben gesagt, wenn du eine einfache Lösung willst und nur ab und zu mal ein WebCam-Bild brauchst (das du dir dann per ButtonClick besorgen willst), dann mach es doch über das Clipboard. Die dafür nötige WM_CAP_EDIT_COPY-Message war ja sowieso schon dabei. Die Var 'handle' in FormCreate sollte aber eigentlich nie local sein, weil du die ja beim irgendwo Abschicken einer jeden nächsten WM_Cap...-Message sowieso überall wieder brauchst. Das Ganze sähe dann also ungefähr so aus:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ClipBrd; 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_PREVIEWRATE = WM_USER + 52; type TForm1 = class(TForm) Panel1: TPanel; Image1: TImage; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private FCapHandle :THandle; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TForm1.FormCreate; begin FCapHandle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 320, 240, Panel1.handle, 1); SendMessage(FCapHandle, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(FCapHandle, WM_CAP_SET_PREVIEWRATE, 1, 0); SendMessage(FCapHandle, wm_cap_set_preview, 1, 0); end; procedure TForm1.Button1Click(Sender: TObject); begin SendMessage(FCapHandle, WM_CAP_EDIT_COPY, 1, 0 ); Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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-2025 by Thomas Breitkreuz