Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bild von der Webcam festhalten? (https://www.delphipraxis.net/60962-bild-von-der-webcam-festhalten.html)

Chrissi91 15. Jan 2006 07:08


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;

TStringlist 15. Jan 2006 08:22

Re: Bild von der Webcam festhalten?
 
Damit kann man das machen.

Chrissi91 15. Jan 2006 08:34

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?

PierreB 15. Jan 2006 08:45

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.

Chrissi91 15. Jan 2006 09:13

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.

TStringlist 15. Jan 2006 09:35

Re: Bild von der Webcam festhalten?
 
Zitat:

Zitat von Chrissi91
... 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?

Ohne ein Dekomprimieren geht das nicht so einfach, weil die Bilder von der WebCam immer nur komprimiert in einer Callback-Funktion vorbeigereicht werden.

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:
Image1.Picture.Bitmap.Assign(form1.FBitmap);
das FBitmap in ein Image.



Alternativ gäbe es sonst höchstens noch die Methode, das Ganze übers Clipboard abzuwickeln (hier, im post von alcaeus). Da wird dann automatisch dekomprimiert. Das taugt aber eigentlich nur dann, wenn du auch wirklich nur ab und zu mal ein Bild benötigst, und nicht permanent (denn dadurch würdest ja dann das ClipBoard für alles andere blockiert werden).

Chrissi91 15. Jan 2006 10:15

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?

SirThornberry 15. Jan 2006 10:48

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.

Chrissi91 15. Jan 2006 14:06

Re: Bild von der Webcam festhalten?
 
Okay, dann will ich es so machen, wie ich es kann :mrgreen:.

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;
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?

TStringlist 15. Jan 2006 17:45

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 05:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz