【问题标题】:How to take snapshot and save to JPEG from webcam using DSPack?如何使用 DSPack 从网络摄像头拍摄快照并保存为 JPEG?
【发布时间】:2011-07-22 21:48:31
【问题描述】:

使用 DSPack、Delphi XE 我需要从网络摄像头拍摄快照并允许预览,在此之前用户可以保存为 JPEG 文件。如何做到这一点(代码)?

【问题讨论】:

    标签: delphi webcam snapshot dspack


    【解决方案1】:

    也许这会起作用,但我还没有测试过。你应该试一试。

    unit main;
    
    interface
    
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, DSPack, DSUtil, DirectShow9;
    
    type
     TMainForm = class(TForm)
       CaptureGraph: TFilterGraph;
       VideoWindow: TVideoWindow;
       ListBox1: TListBox;
       VideoSourceFilter: TFilter;
       StartButton: TButton;
       StopButton: TButton;
       Label1: TLabel;
       ListBox2: TListBox;
       Label3: TLabel;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure ListBox1Click(Sender: TObject);
       procedure StartButtonClick(Sender: TObject);
       procedure StopButtonClick(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;
    
    var
     MainForm: TMainForm;
     VideoDevice: TSysDevEnum;
     VideoMediaTypes: TEnumMediaType;
    implementation
    
    {$R *.dfm}
    
    { TMainForm }
    
    procedure TMainForm.FormCreate(Sender: TObject);
    var i: integer;
    begin
     VideoDevice := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
     for i := 0 to VideoDevice.CountFilters - 1 do
       ListBox1.Items.Add(VideoDevice.Filters[i].FriendlyName);
    
     VideoMediaTypes := TEnumMediaType.Create;
    end;
    
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
     VideoDevice.Free;
     VideoMediaTypes.Free;
    end;
    
    // Selecting of the video source
    procedure TMainForm.ListBox1Click(Sender: TObject);
    var
     PinList: TPinList;
     i: integer;
    begin
     VideoDevice.SelectGUIDCategory(CLSID_VideoInputDeviceCategory);
     if ListBox1.ItemIndex <> -1 then
     begin
       // Set the device which we work with
       VideoSourceFilter.BaseFilter.Moniker := VideoDevice.GetMoniker(ListBox1.ItemIndex);
       VideoSourceFilter.FilterGraph := CaptureGraph;
       CaptureGraph.Active := true;
       PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
       ListBox2.Clear;
       VideoMediaTypes.Assign(PinList.First);
       // Adding permission to ListBox2, which supports device
       for i := 0 to VideoMediaTypes.Count - 1 do
         ListBox2.Items.Add(VideoMediaTypes.MediaDescription[i]);
       CaptureGraph.Active := false;
       PinList.Free;
       StartButton.Enabled := true;
     end;
    end;
    
    procedure TMainForm.StartButtonClick(Sender: TObject);
    var
     PinList: TPinList;
    begin
    
     // Activating graph filter, at this stage the source filter is added to the graph
     CaptureGraph.Active := true;
    
     // The configuration of the output device
     if VideoSourceFilter.FilterGraph <> nil then
     begin
       PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
       if ListBox2.ItemIndex <> -1 then
         with (PinList.First as IAMStreamConfig) do
           SetFormat(VideoMediaTypes.Items[ListBox2.ItemIndex].AMMediaType^);
       PinList.Free;
     end;
    
     // now render streams
     with CaptureGraph as IcaptureGraphBuilder2 do
     begin
       // Hooking up a preview video (VideoWindow)
       if VideoSourceFilter.BaseFilter.DataLength > 0 then
         RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter,
           nil , VideoWindow as IBaseFilter);
    
     end;
    // Launch video
     CaptureGraph.Play;
     StopButton.Enabled := true;
     StartButton.Enabled := false;
     ListBox2.Enabled := false;
     ListBox1.Enabled := false;
    end;
    
    // Stop video
    procedure TMainForm.StopButtonClick(Sender: TObject);
    begin
     StopButton.Enabled := false;
     StartButton.Enabled := true;
     CaptureGraph.Stop;
     CaptureGraph.Active := False;
     ListBox2.Enabled := true;
     ListBox1.Enabled := true;
    end;
    
    end.
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多