Prendre une photo à partir d'un web-caméra à l'aide de WinAPI dans Delphi 7
J'ai un challenge: créer un programme qui prend une image à partir d'un web-caméra quand un bouton est pressé. Condition supplémentaire: ne pas utiliser de composants tiers (comme DSPack), juste la WinAPI. J'ai écrit le code suivant.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,ShellAPI;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_SAVEDIB = WM_CAP_START + 25;
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
WM_CAP_SEQUENCE = WM_CAP_START + 62;
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
stdcall external 'AVICAP32.DLL';
var
Form1: TForm1;
implementation
{$R *.dfm}
var hWndC : THandle;
procedure TForm1.Button1Click(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
0,
0,
Panel1.Width,
Panel1.Height,
Panel1.Handle,
0);
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hWndC := 0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
end;
end;
end.
Il y a deux boutons et un panneau sur la forme. Le programme compile correctement, et fonctionne bien, une fois lancé, la première fois; toutefois, à la deuxième et les suivantes lance il apparaît une fenêtre qui propose de sélectionner un périphérique, mais même après l'avoir sélectionné ne fonctionne pas. Je suppose que, après le premier lancement, le programme n'est pas le retour de l'appareil pilote à son état d'origine.
Est-ce donc? Si elle l'est, comment puis-je la corriger? Si non, pourquoi ne pas travailler sur la deuxième et les autres lance? Merci pour les suggestions.
OnDestroy
cas, essayez de fermer la fenêtre de capture en l'envoyant WM_CLOSE
message.Triste, mais il n'est pas résolu le problème
Cette API est vraiment préhistorique, pourquoi ne pas utiliser DirectShow?
ou d'Acquisition d'Images Windows? msdn.microsoft.com/en-us/library/windows/desktop/...
Vidéo Pour Windows, est admissible à titre de WinAPI si vous me demandez! msdn.microsoft.com/en-us/library/windows/desktop/...
OriginalL'auteur skeeph | 2013-03-30
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je ne vais pas être en mesure de vraiment vous aider avec votre code actuel, puis de nouveau je pense que personne ne va donc, ici, est une alternative.
Je comprends que vous ne souhaitez pas utiliser un 3e composant de partie, mais je pense que l'utilisation d'AVICAP32.DLL n'est pas une meilleure option.
Cette page offre un excellent moyen d'utiliser les webcams sous windows, il est très fiable et permet de définir toutes les cam de la propriété. Son tout opensource, facile à utiliser et basé sur windows natif bibliothèques DirectX.
Il ne m'a jamais manqué.
http://www.delphibasics.info/home/delphibasicsprojects/directxdelphiwebcamcaptureexample
Bonne chance et amusez-vous,
Delphi rochers.
OriginalL'auteur Kapytanhook