CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  GAME,图形处理/多媒体

关于通过摄像头采集证件照的问题——在线等

楼主moonling(月亮居士)2005-11-10 09:49:36 在 Delphi / GAME,图形处理/多媒体 提问

我需要编一个程序,通过dspack控件捕捉视频拍照,现在视频捕捉和拍照已经实现了,但是拍出的照片尺寸比例失调,我怎样才能队拍出的照片进行裁切呢? 问题点数:50、回复次数:5Top

1 楼moonling(月亮居士)回复于 2005-11-10 09:55:09 得分 0

我看到过,可以在视频窗口上放置一个固定的区域框,该框可以通过鼠标进行拖动,拍下的照片就是区域框中的内容,不知道怎么实现!希望高手能够指教!Top

2 楼S.F.(chinasf.cnblogs.com)回复于 2005-11-10 10:51:49 得分 0

帮你写一个吧,dspack很简单,vfw也更简单;稍后。Top

3 楼S.F.(chinasf.cnblogs.com)回复于 2005-11-10 14:05:38 得分 50

unit   main;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   DSUtil,   StdCtrls,   DSPack,   DirectShow9,   Menus,   ExtCtrls,   Math;  
   
  type  
      TVideoForm   =   class(TForm)  
          FilterGraph:   TFilterGraph;  
          VideoWindow:   TVideoWindow;  
          MainMenu1:   TMainMenu;  
          Devices:   TMenuItem;  
          Filter:   TFilter;  
          SampleGrabber:   TSampleGrabber;  
          CallBack:   TCheckBox;  
          Panel:   TPanel;  
          btnCopyScr:   TButton;  
          ScrollBox1:   TScrollBox;  
          Image1:   TImage;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);  
          procedure   SampleGrabberBuffer(sender:   TObject;   SampleTime:   Double;  
              pBuffer:   Pointer;   BufferLen:   Integer);  
          procedure   FormDestroy(Sender:   TObject);  
          procedure   btnCopyScrClick(Sender:   TObject);  
      private  
   
      public  
   
          procedure   PreviewFormOnMouseMove(Sender:   TObject;   Shift:   TShiftState;   X,  
              Y:   Integer);  
          procedure   OnSelectDevice(sender:   TObject);  
      end;  
   
  var  
      VideoForm                                       :   TVideoForm;  
      SysDev                                             :   TSysDevEnum;  
      PreviewForm                                   :   TForm;   //拍照区域  
      Bmp                                                   :   TBitmap;   //缓存图象  
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TVideoForm.FormCreate(Sender:   TObject);  
  var  
      i                                                       :   integer;  
      Device                                             :   TMenuItem;  
      nP,   P                                               :   TPoint;  
  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;  
   
      //创建拍照区域  
      PreviewForm   :=   TForm.Create(SELF);  
      PreviewForm.BorderStyle   :=   bsNone;  
      PreviewForm.Width   :=   Panel.Width   div   2;  
      PreviewForm.Height   :=   Panel.Height   div   2;  
      PreviewForm.Left   :=   0;  
      PreviewForm.Top   :=   0;  
      PreviewForm.FormStyle   :=   fsStayOnTop;  
      PreviewForm.Color   :=   ClBlue;  
      PreviewForm.AlphaBlendValue   :=   127;  
      PreviewForm.AlphaBlend   :=   TRUE;  
      PreviewForm.OnMouseMove   :=   PreviewFormOnMouseMove;  
      //确定位置  
      P.X   :=   Panel.Left;  
      P.Y   :=   Panel.Top;  
      nP   :=   ClientToScreen(p);  
   
      PreviewForm.Left   :=   nP.X;  
      PreviewForm.Top   :=   nP.Y;  
      PreviewForm.Show;  
   
      Bmp   :=   TBitmap.Create;  
  end;  
   
  procedure   TVideoForm.OnSelectDevice(sender:   TObject);  
  begin  
      FilterGraph.ClearGraph;  
      FilterGraph.Active   :=   false;  
      Filter.BaseFilter.Moniker   :=   SysDev.GetMoniker(TMenuItem(Sender).tag);  
      FilterGraph.Active   :=   true;  
      with   FilterGraph   as   ICaptureGraphBuilder2   do  
          RenderStream(@PIN_CATEGORY_PREVIEW,   nil,   Filter   as   IBaseFilter,   SampleGrabber  
              as   IBaseFilter,   VideoWindow   as   IbaseFilter);  
      FilterGraph.Play;  
  end;  
   
  procedure   TVideoForm.FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);  
  begin  
      CallBack.Checked   :=   False;  
      SysDev.Free;  
      FilterGraph.ClearGraph;  
      FilterGraph.Active   :=   false;  
  end;  
   
  procedure   TVideoForm.SampleGrabberBuffer(sender:   TObject;  
      SampleTime:   Double;   pBuffer:   Pointer;   BufferLen:   Integer);  
  var  
      MyCanvas                                         :   TCanvas;  
  begin  
      if   CallBack.Checked   then  
      begin  
          MyCanvas   :=   TCanvas.Create;  
          MyCanvas.Handle   :=   GetDc(Panel.Handle);  
          MyCanvas.Lock;  
          try  
              SampleGrabber.GetBitmap(Bmp,   pBuffer,   BufferLen);  
              MyCanvas.Draw(0,   0,   Bmp);  
          finally  
              MyCanvas.Unlock;  
          end;  
      end;  
  end;  
   
  //控件(拖动、放大、缩小)  
   
  procedure   ManipulateControl(Control:   TControl;   Shift:   TShiftState;   X,   Y,  
      Precision:   integer);  
  var  
      SC_MANIPULATE                               :   Word;  
  begin  
      if   (X   <=   Precision)   and   (Y   >   Precision)   and   (Y   <   Control.Height   -   Precision)  
          then  
      begin  
          SC_MANIPULATE   :=   $F001;  
          Control.Cursor   :=   crSizeWE;  
      end  
      else   if   (X   >=   Control.Width   -   Precision)   and   (Y   >   Precision)   and   (Y   <  
          Control.Height   -   Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F002;  
          Control.Cursor   :=   crSizeWE;  
      end  
      else   if   (X   >   Precision)   and   (X   <   Control.Width   -   Precision)   and   (Y   <=  
          Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F003;  
          Control.Cursor   :=   crSizeNS;  
      end  
      else   if   (X   <=   Precision)   and   (Y   <=   Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F004;  
          Control.Cursor   :=   crSizeNWSE;  
      end  
      else   if   (X   >=   Control.Width   -   Precision)   and   (Y   <=   Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F005;  
          Control.Cursor   :=   crSizeNESW;  
      end  
      else   if   (X   >   Precision)   and   (X   <   Control.Width   -   Precision)   and   (Y   >=  
          Control.Height   -   Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F006;  
          Control.Cursor   :=   crSizeNS;  
      end  
      else   if   (X   <=   Precision)   and   (Y   >=   Control.Height   -   Precision)   then  
      begin  
          SC_MANIPULATE   :=   $F007;  
          Control.Cursor   :=   crSizeNESW;  
      end  
      else   if   (X   >=   Control.Width   -   Precision)   and   (Y   >=   Control.Height   -   Precision)  
          then  
      begin  
          SC_MANIPULATE   :=   $F008;  
          Control.Cursor   :=   crSizeNWSE;  
      end  
      else   if   (X   >   5)   and   (Y   >   5)   and   (X   <   Control.Width   -   5)   and   (Y   <   Control.Height  
          -   5)   then  
      begin  
          SC_MANIPULATE   :=   $F009;  
          Control.Cursor   :=   crSizeAll;  
      end  
      else  
      begin  
          SC_MANIPULATE   :=   $F000;  
          Control.Cursor   :=   crDefault;  
      end;  
      if   Shift   =   [ssLeft]   then  
      begin  
          ReleaseCapture;  
          Control.Perform(WM_SYSCOMMAND,   SC_MANIPULATE,   0);  
      end;  
  end;  
   
  procedure   TVideoForm.PreviewFormOnMouseMove(Sender:   TObject;  
      Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
      ManipulateControl((Sender   as   TControl),   Shift,   X,   Y,   10);  
  end;  
   
  procedure   TVideoForm.FormDestroy(Sender:   TObject);  
  begin  
      Bmp.Free;  
      PreviewForm.Free;  
  end;  
   
  procedure   TVideoForm.btnCopyScrClick(Sender:   TObject);  
  var  
      R                                                       :   TRect;  
      P,   CP                                               :   TPoint;  
      SaveBmp                                           :   TBitmap;  
  begin  
      P.X   :=   PreviewForm.Left;  
      P.Y   :=   PreviewForm.Top;  
      CP   :=   ScreenToClient(P);  
   
      CP.X   :=   CP.X   -   Panel.Left;  
      CP.Y   :=   CP.Y   -   Panel.Top;  
   
      R.Left   :=   CP.X;  
      R.Top   :=   CP.Y;  
      R.Right   :=   CP.X   +   PreviewForm.Width;  
      R.Bottom   :=   CP.Y   +   PreviewForm.Height;  
      Caption   :=   Format('%d/%d,   %d/%d/%d/%d',   [cp.x,   cp.y,   R.left,   r.top,   r.right,  
          r.bottom]);  
   
      if   (R.Right   >   R.Left)   and   (R.Bottom   >   R.Top)   then  
      begin  
          SaveBmp   :=   TBitmap.Create;  
          SaveBmp.Width   :=   R.Right   -   R.Left;  
          SaveBmp.Height   :=   R.Bottom   -   R.Top;  
          SaveBmp.PixelFormat   :=   pf24Bit;  
   
          SaveBmp.Canvas.Brush.Color   :=   clBlack;  
          SaveBmp.Canvas.FillRect(SaveBmp.Canvas.ClipRect);  
          try  
            //获得区域内的局部图象  
              SaveBmp.Canvas.CopyRect(SaveBmp.Canvas.ClipRect,   Bmp.Canvas,   R);  
          except  
          end;  
   
          Image1.Picture.Bitmap.Assign(SaveBmp);   //显示到新图象框内。  
          SaveBmp.Free;  
      end;  
   
  end;  
   
  end.  
   
   
  需要完整的工程可以给我来信;  
  chinasf   at   hotmail.comTop

4 楼liuex1235(盲流)回复于 2005-11-10 14:30:55 得分 0

学习Top

5 楼moonling(月亮居士)回复于 2005-11-15 14:16:00 得分 0

拍摄的图像不能正确显示在image上,我的为一片黑!希望继续帮忙!Top

相关问题

  • 屏幕采集与摄像头采集有什么区别吗?
  • 求用DirectShow通过摄像头采集图像程序!
  • 如何获取usb接口摄像头采集的图像数据
  • 用摄像头能制作vcd吗,需不需要视频采集卡?
  • 网络摄像头用于图像采集设备是否可行?
  • 急求摄像头采集到的位图图象保存的代码!!!
  • 如何读取摄像头所采集到的数据流,并显示视频???
  • .net编写一个USB摄像头视频采集的程序,可行吗?
  • 怎样在摄像头(如USB)采集到数据后返回前对数据进行处理????
  • 除了摄像头,和采集卡,有没有USB式的摄像和电脑同步工作录像?

关键词

  • 区域
  • 照片
  • previewform
  • savebmp
  • sysdev
  • precision
  • dspack
  • tvideoform
  • tobject
  • canvas

得分解答快速导航

  • 帖主:moonling
  • S.F.

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo