AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild von der Webcam festhalten?

Ein Thema von Chrissi91 · begonnen am 15. Jan 2006 · letzter Beitrag vom 25. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#1

Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 07:08
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.DLLname '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;
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 08:22
Damit kann man das machen.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#3

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 08:34
Danke. Ich habe es mir mal durchgelesen und habe VERSUCHT 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?
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#4

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 08:45
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.
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#5

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 09:13
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.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 09:35
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

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).
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#7

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 10:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 10:48
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#9

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 14:06
Okay, dann will ich es so machen, wie ich es kann .

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.DLLname '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?
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Bild von der Webcam festhalten?

  Alt 15. Jan 2006, 17:45
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.DLLname '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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.
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