Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Webcam-Schnappschuss - OHNE(!) zwischenspeichern (https://www.delphipraxis.net/137773-webcam-schnappschuss-ohne-zwischenspeichern.html)

LDericher 28. Jul 2009 14:53


Webcam-Schnappschuss - OHNE(!) zwischenspeichern
 
Hallo DP!

Ich möchte gerne mit (etwa) 2fps meine Webcam abtasten und das Bild ausgeben lassen.
Zur Zeit habe ich dafür eine von smallsmoker in der Codelib veröffentlichte Version, die eigentlich genau das kann, aber dafür das Bild immer zwischenspeichern muss:

Delphi-Quellcode:
procedure GetWebcamSnapshot(Filename: string);
var
  bmi: BITMAPINFO;
begin
  if isConnected then
  begin
    SendMessage(CaptureWindow, WM_CAP_SET_VIDEOFORMAT, 0, integer(@bmi));
    SendMessage(CaptureWindow, WM_CAP_GRAB_FRAME, 0, 0);
    SendMessage(CaptureWindow, WM_CAP_SAVEDIB, 0, longint(PChar(Filename)));
  end;
end;
Das Grundprinzip gefällt mir so weit und ich möchte es auch weiterhin per Timer - Oder vielleicht auch als Thread - einbinden.
Mein Problem ist jetzt, aus dieser Prozedur eine Funktion zu erstellen, die ein TBitmap liefert, ohne es auf der Festplatte zwischenlagern zu müssen.
Wenn möglich ohne großen zusätzlichen Rechenaufwand...!

Vielen Dank schonmal im Voraus,

Der LDer.

LDericher 28. Jul 2009 16:12

Re: Webcam-Schnappschuss - OHNE(!) zwischenspeichern
 
Delphi-Quellcode:
function GetWebcamSS:TBitmap;
var
  bmi: BITMAPINFO;
begin
  if isConnected then
  begin
    SendMessage(CaptureWindow, WM_CAP_SET_VIDEOFORMAT, 0, integer(@bmi));
    SendMessage(CaptureWindow, WM_CAP_GRAB_FRAME, 0, 0);
    Result:=TBitmap.Create;
    Result.PixelFormat := pf24Bit;
    SendMessage(CaptureWindow,WM_CAP_EDIT_COPY,1,0);
    Result.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
  end;
end;
... gefunden ;)

Florian H 28. Jul 2009 16:37

Re: Webcam-Schnappschuss - OHNE(!) zwischenspeichern
 
Das Ding kopiert das Bild in die Zwischenablage und macht damit die Benutzung derselben durch den Anwender praktisch unmöglich .. in 95% der Fälle ein absolutes No-Go und auch in den restlichen 5% sicher keine schöne Lösung.

Hatte mal dasselbe Problem wie du ... hab aber keine Lösung gefunden, die auf allen aktuellen Betriebssystem zuverlässig funktioniert.

himitsu 28. Jul 2009 17:07

Re: Webcam-Schnappschuss - OHNE(!) zwischenspeichern
 
hab jetzt nicht alles da durchgelesen, aber so auf den ersten Blick klingt das doch gut?
WM_CAP_SET_CALLBACK_FRAME

hoff ich hab des jetzt nicht falsch verstanden, aber wenn, dann bekommt die registrierte Prozedur das Bild :gruebel:

turboPASCAL 28. Jul 2009 17:18

Re: Webcam-Schnappschuss - OHNE(!) zwischenspeichern
 
Also, das mit der Zwischenablage ist keine gute Lösung wie schon geschrieben.

So ohne weiteres klappt das auch nicht mit solch einem Mini-Code, da muss man
schon etwas weiter in die Materie rein.

Mit unterstützung der Datei vfw.pas kann man ein Webcambilt als Bitmap grappen.

http://www.delphipraxis.net/internal...=376191#376191

Zu beachten wäre:
http://www.delphipraxis.net/internal...021738#1021738
da gibt es auch ein vereinfachtes Beispiel mit DirectShow auf Basis des
Programmes von grizzly: http://www.delphipraxis.net/internal...=558841#558841


Zitat:

Zitat von himitsu
hab jetzt nicht alles ... WM_CAP_SET_CALLBACK_FRAME ... dann bekommt die registrierte Prozedur das Bild :gruebel:

Ja. (wenn ich mich nicht irre)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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