首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用DSPack和Delphi5从摄像头抓取并保存文件

如何利用DSPack和Delphi5从摄像头抓取并保存文件
EN

Stack Overflow用户
提问于 2013-08-27 07:28:05
回答 1查看 3.1K关注 0票数 2

现在,我正在尝试用Delphi 5制作一个程序,从摄像头上拍摄一张照片。我使用的是Delphi5和DSPack 2.3.1,因为很多人建议使用它,没错,这是我第一次用delphi编写多媒体程序。

我已经能够列出和添加相机连接到我的计算机动态。我也能够显示什么摄像头“看到”,打开一个视频,并捕捉它。但现在我无法从摄像头上捕捉到一张照片。

我有一个TImage,我命名为“图像”,以检查图片是否被捕获。当我使用我的代码打开并捕获视频时,它会显示在TImage中。但是,当我试图捕捉一个网络摄像头,它只是空白,没有捕获任何东西。我保存的文件也是空白的。

有人能检查我的代码哪一部分出错了吗?谢谢之前..。

这是我代码的一部分

代码语言:javascript
复制
var SysDev: TSysDevEnum;
    FotoBitmap: TBitmap;

implementation

{$R *.DFM}

procedure Form1.FormCreate(Sender: TObject);
var
  i: integer;
  Device: TMenuItem;
begin
  SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
  if SysDev.CountFilters > 0 then
    for i := 0 to SysDev.CountFilters - 1 do
    begin
      Device := TMenuItem.Create(Devices);
      Device.Caption := SysDev.Filters[i].FriendlyName;
      Device.Tag := i;
      Device.OnClick := OnSelectDevice;
      Devices.Add(Device);
    end;
end;

procedure Form1.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  SysDev.Free;
  FilterGraph.ClearGraph;
  FilterGraph.Active := false;
end;

procedureForm1.OnSelectDevice(sender: TObject);
var
  CaptureGraph: ICaptureGraphBuilder2;
  SourceFilter, DestFilter: IBaseFilter;
begin
  FilterGraph.ClearGraph;
  FilterGraph.Active := false;

  Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
  Filter.FilterGraph := FilterGraph;

  FilterGraph.Active := true;

  FilterGraph.QueryInterface(ICaptureGraphBuilder2, CaptureGraph);

  Filter.QueryInterface(IBaseFilter, SourceFilter);

  VideoWindow.QueryInterface(IBaseFilter, DestFilter);

  if Filter.BaseFilter.DataLength > 0 then
    CaptureGraph.RenderStream(nil, nil, SourceFilter, nil, DestFilter);

  FilterGraph.Play;
  CaptureGraph := nil;
  SourceFilter := nil;
  DestFilter   := nil;
end;

procedure Form1.SnapshotClick(Sender: TObject);
var dir : String;
begin
  if edt_nama_foto.Text <> '' then begin
    dir := ExtractFilePath(Application.ExeName);
    FotoBitmap := TBitmap.Create;

    try
      SampleGrabber.GetBitmap(FotoBitmap);
      SampleGrabber.GetBitmap(Image.Picture.Bitmap);
      showmessage(dir + 'Image\Foto\' + edt_nama_foto.Text + '.bmp');
      FotoBitmap.SaveToFile(dir + 'Image\Foto\' + edt_nama_foto.Text + '.bmp');
    finally
      FotoBitmap.Free;
    end;
  end;
end;

procedure Form1.btn_batalClick(Sender: TObject);
begin
  modalresult:=mrCancel;
end;

procedure Form1.btn_simpanClick(Sender: TObject);
begin
  If CheckbeforeOK then
  begin
    ModalResult :=mrOK;
  end else begin
    ModalResult := mrNone;
  end;
end;

function Form1.CheckbeforeOK:Boolean;
var flag:boolean;
    MasterDataSet:TQuery;
begin
  Flag:=True;

  if flag and not(checkedit(nil, nil, edt_nama_foto, edt_nama_foto.Text, 'Nama Foto'))
  then begin
    flag := False;
  end else begin
    Snapshot.Click;
  end;
  Result := flag;
end;

procedure Form1.SampleGrabberBuffer(sender: TObject;
  SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
begin
  Image.Picture.Bitmap.Canvas.Lock;
  try
    SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen);
  finally
    Image.Picture.Bitmap.Canvas.UnLock;
  end;
end;

end.
EN

回答 1

Stack Overflow用户

发布于 2014-08-16 06:41:30

将视频帧“转换”成图像对象的对象是SampleGrabber

SampleGrabber.GetBitmap(Image.Picture.Bitmap,pBuffer,BufferLen);

但是,在构建图形时,需要插入它来过滤图形,而且显然在OnSelectDevice中没有这样做:根本没有提到SampleGrabber。您需要将其包含到RenderStream调用中,或者以其他方式将其插入其中,这样视频就可以通过它传输,您的回调被称为将数据复制到TImage中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18459481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档