c#摄像头编程实例

来源:互联网 发布:天猫客服数据在哪里看 编辑:程序博客网 时间:2024/05/16 06:59
 

c#摄像头编程实例(转) http://www.chenjiliang.com/Article/View.aspx?ArticleID=3974&TypeID=84

安装摄像头后,一般可以找到一个avicap32.dll文件

这是一个关于摄像头的类

using   system;
using   System.Runtime.InteropServices;

namespace   webcam
{
///  
///   avicap   的摘要说明。
///  
public   class   showVideo
{
//   showVideo   calls
[DllImport("avicap32.dll")]   public   static   extern   IntPtr   capCreateCaptureWindowA(byte[]   lpszWindowName,   int   dwStyle,   int   x,   int   y,   int   nWidth,   int   nHeight,   IntPtr   hWndParent,   int   nID);
[DllImport("avicap32.dll")]   public   static   extern   bool   capGetDriverDescriptionA(short   wDriver,   byte[]   lpszName,   int   cbName,   byte[]   lpszVer,   int   cbVer);
[DllImport("User32.dll")]   public   static   extern   bool   SendMessage(IntPtr   hWnd,   int   wMsg,   bool   wParam,   int   lParam);  
[DllImport("User32.dll")]   public   static   extern   bool   SendMessage(IntPtr   hWnd,   int   wMsg,   short   wParam,   int   lParam);  
[DllImport("User32.dll")]   public   static   extern   bool   SendMessage(IntPtr   hWnd,   int   wMsg,   short   wParam,   FrameEventHandler   lParam);  
[DllImport("User32.dll")]   public   static   extern   bool   SendMessage(IntPtr   hWnd,   int   wMsg,   int   wParam,   ref   BITMAPINFO   lParam);
[DllImport("User32.dll")]   public   static   extern   int   SetWindowPos(IntPtr   hWnd,   int   hWndInsertAfter,   int   x,   int   y,   int   cx,   int   cy,   int   wFlags);
[DllImport("avicap32.dll")]public   static   extern   int   capGetVideoFormat(IntPtr   hWnd,   IntPtr   psVideoFormat,   int   wSize   );

//   constants
public   const   int   WM_USER   =   0x400;
public   const   int   WS_CHILD   =   0x40000000;
public   const   int   WS_VISIBLE   =   0x10000000;
public   const   int   SWP_NOMOVE   =   0x2;
public   const   int   SWP_NOZORDER   =   0x4;
public   const   int   WM_CAP_DRIVER_CONNECT   =   WM_USER   +   10;
public   const   int   WM_CAP_DRIVER_DISCONNECT   =   WM_USER   +   11;
public   const   int   WM_CAP_SET_CALLBACK_FRAME   =   WM_USER   +   5;
public   const   int   WM_CAP_SET_PREVIEW   =   WM_USER   +   50;
public   const   int   WM_CAP_SET_PREVIEWRATE   =   WM_USER   +   52;
public   const   int   WM_CAP_SET_VIDEOFORMAT   =   WM_USER   +   45;
  
//   Structures
[StructLayout(LayoutKind.Sequential)]   public   struct   VIDEOHDR
{
[MarshalAs(UnmanagedType.I4)]   public   int   lpData;
[MarshalAs(UnmanagedType.I4)]   public   int   dwBufferLength;
[MarshalAs(UnmanagedType.I4)]   public   int   dwBytesUsed;
[MarshalAs(UnmanagedType.I4)]   public   int   dwTimeCaptured;
[MarshalAs(UnmanagedType.I4)]   public   int   dwUser;
[MarshalAs(UnmanagedType.I4)]   public   int   dwFlags;
[MarshalAs(UnmanagedType.ByValArray,   SizeConst=4)]   public   int[]   dwReserved;
}

[structlayout(layoutkind.sequential)]   public   struct   bitmapinfoheader
{
[MarshalAs(UnmanagedType.I4)]   public   Int32   biSize   ;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biWidth   ;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biHeight   ;
[MarshalAs(UnmanagedType.I2)]   public   short   biPlanes;
[MarshalAs(UnmanagedType.I2)]   public   short   biBitCount   ;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biCompression;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biSizeImage;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biXPelsPerMeter;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biYPelsPerMeter;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biClrUsed;
[MarshalAs(UnmanagedType.I4)]   public   Int32   biClrImportant;
}  

[structlayout(layoutkind.sequential)]   public   struct   bitmapinfo
{
[MarshalAs(UnmanagedType.Struct,   SizeConst=40)]   public   BITMAPINFOHEADER   bmiHeader;
[MarshalAs(UnmanagedType.ByValArray,   SizeConst=1024)]   public   Int32[]   bmiColors;
}

public   delegate   void   FrameEventHandler(IntPtr   lwnd,   IntPtr   lpVHdr);  
//   Public   methods
public   static   object   GetStructure(IntPtr   ptr,valueType   structure)
{
return   Marshal.PtrToStructure(ptr,structure.GetType());
}
public   static   object   GetStructure(int   ptr,valueType   structure)
{
return   GetStructure(new   IntPtr(ptr),structure);
}  
public   static   void   Copy(IntPtr   ptr,byte[]   data)
{
Marshal.Copy(ptr,data,0,data.Length);
}  
public   static   void   Copy(int   ptr,byte[]   data)
{
Copy(new   IntPtr(ptr),data);
}  
public   static   int   SizeOf(object   structure)
{
return   Marshal.SizeOf(structure);  
}
}

//web   camera   class
public   class   WebCamera
{
//   Constructur
public   WebCamera(IntPtr   handle,   int   width,int   height)
{
mControlPtr   =   handle;
mWidth   =   width;
mHeight   =   height;
}  
//   delegate   for   frame   callback
public   delegate   void   RecievedFrameEventHandler(byte[]   data);
public   event   RecievedFrameEventHandler   RecievedFrame;  
private   IntPtr   lwndC;   //   Holds   the   unmanaged   handle   of   the   control
private   IntPtr   mControlPtr;   //   Holds   the   managed   pointer   of   the   control
private   int   mWidth;
private   int   mHeight;  
private   showVideo.FrameEventHandler   mFrameEventHandler;   //   Delegate   instance   for   the   frame   callback   -   must   keep   alive!   gc   should   NOT   collect   it  
//   Close   the   web   camera
public   void   CloseWebcam()
{
this.capDriverDisconnect(this.lwndC);
}  
//   start   the   web   camera
public   void   StartWebCam()
{
byte[]   lpszName   =   new   byte[100];
byte[]   lpszVer   =   new   byte[100];
  
showVideo.capGetDriverDescriptionA(0,   lpszName,   100,lpszVer,   100);
this.lwndC   =   showVideo.capCreateCaptureWindowA(lpszName,   showVideo.WS_VISIBLE   +   showVideo.WS_CHILD,   0,   0,   mWidth,   mHeight,   mControlPtr,   0);
   if   (this.capDriverConnect(this.lwndC,   0))
{
this.capPreviewRate(this.lwndC,   66);
this.capPreview(this.lwndC,   true);
showVideo.BITMAPINFO   bitmapinfo   =   new   showVideo.BITMAPINFO();  
bitmapinfo.bmiHeader.biSize   =   showVideo.SizeOf(bitmapinfo.bmiHeader);
bitmapinfo.bmiHeader.biWidth   =   352;
bitmapinfo.bmiHeader.biHeight   =   288;
bitmapinfo.bmiHeader.biPlanes   =   1;
bitmapinfo.bmiHeader.biBitCount   =   24;
this.capSetVideoFormat(this.lwndC,   ref   bitmapinfo,   showVideo.SizeOf(bitmapinfo));
this.mFrameEventHandler   =   new   showVideo.FrameEventHandler(FrameCallBack);
this.capSetCallbackOnFrame(this.lwndC,   this.mFrameEventHandler);
showVideo.SetWindowPos(this.lwndC,   0,   0,   0,   mWidth   ,   mHeight   ,   6);
}  
}

//   private   functions
private   bool   capDriverConnect(IntPtr   lwnd,   short   i)
{
return   showVideo.SendMessage(lwnd,   showVideo.WM_CAP_DRIVER_CONNECT,   i,   0);
}

private   bool   capdriverdisconnect(intptr   lwnd)
{
return   showVideo.SendMessage(lwnd,   showVideo.WM_CAP_DRIVER_DISCONNECT,   0,   0);
}  
private   bool   capPreview(IntPtr   lwnd,   bool   f)
{
return   showVideo.SendMessage(lwnd,   showVideo.WM_CAP_SET_PREVIEW   ,   f,   0);
}

private   bool   cappreviewrate(intptr   lwnd,   short   wms)
{
return   showVideo.SendMessage(lwnd,   showVideo.WM_CAP_SET_PREVIEWRATE,   wMS,   0);
}  
private   bool   capSetCallbackOnFrame(IntPtr   lwnd,   showVideo.FrameEventHandler   lpProc)
{  
return   showVideo.SendMessage(lwnd,   showVideo.WM_CAP_SET_CALLBACK_FRAME,   0,   lpProc);
}

private   bool   capsetvideoformat(intptr   hcapwnd,   ref   showvideo.bitmapinfo   bmpformat,   int   capformatsize)
{
return   showVideo.SendMessage(hCapWnd,   showVideo.WM_CAP_SET_VIDEOFORMAT,   CapFormatSize,   ref   BmpFormat);
}

private   void   framecallback(intptr   lwnd,   intptr   lpvhdr)
{
showVideo.VIDEOHDR   videoHeader   =   new   showVideo.VIDEOHDR();
byte[]   VideoData;
videoHeader   =   (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr,videoHeader);
VideoData   =   new   byte[videoHeader.dwBytesUsed];
showVideo.Copy(videoHeader.lpData   ,VideoData);
if   (this.RecievedFrame   !=   null)
this.RecievedFrame   (VideoData);
}
}

}

具体调用如下:

using   system;
using   System.Drawing;
using   System.Collections;
using   System.ComponentModel;
using   System.Windows.Forms;
using   System.Data;
using   webcam;

namespace   webcam
{
///  
///   Form1   的摘要说明。
///  
public   class   Form1   :   System.Windows.Forms.Form
{
private   System.Windows.Forms.Panel   panelPreview;
private   System.Windows.Forms.Button   b_play;
private   System.Windows.Forms.Button   b_stop;
///  
///   必需的设计器变量。
///  
private   System.ComponentModel.Container   components   =   null;
WebCamera   wc;

public   form1()
{
//
//   Windows   窗体设计器支持所必需的
//
InitializeComponent();

//
//   TODO:   在   InitializeComponent   调用后添加任何构造函数代码
//
}

///  
///   清理所有正在使用的资源。
///  
protected   override   void   Dispose(   bool   disposing   )
{
if(   disposing   )
{
if   (components   !=   null)  
{
components.Dispose();
}
}
base.Dispose(   disposing   );
}

#region   windows   窗体设计器生成的代码
///  
///   设计器支持所需的方法   -   不要使用代码编辑器修改
///   此方法的内容。
///  
private   void   InitializeComponent()
{
this.b_play   =   new   System.Windows.Forms.Button();
this.panelPreview   =   new   System.Windows.Forms.Panel();
this.b_stop   =   new   System.Windows.Forms.Button();
this.SuspendLayout();
//  
//   b_play
//  
this.b_play.Location   =   new   System.Drawing.Point(280,   368);
this.b_play.Name   =   "b_play";
this.b_play.TabIndex   =   0;
this.b_play.Text   =   "&Play";
this.b_play.Click   +=   new   System.EventHandler(this.button1_Click);
//  
//   panelPreview
//  
this.panelPreview.Location   =   new   System.Drawing.Point(8,   8);
this.panelPreview.Name   =   "panelPreview";
this.panelPreview.Size   =   new   System.Drawing.Size(344,   272);
this.panelPreview.TabIndex   =   1;
//  
//   b_stop
//  
this.b_stop.Enabled   =   false;
this.b_stop.Location   =   new   System.Drawing.Point(360,   368);
this.b_stop.Name   =   "b_stop";
this.b_stop.TabIndex   =   2;
this.b_stop.Text   =   "&Stop";
this.b_stop.Click   +=   new   System.EventHandler(this.b_stop_Click);
//  
//   Form1
//  
this.AutoScaleBaseSize   =   new   System.Drawing.Size(6,   14);
this.ClientSize   =   new   System.Drawing.Size(464,   413);
this.Controls.Add(this.b_stop);
this.Controls.Add(this.panelPreview);
this.Controls.Add(this.b_play);
this.MaximizeBox   =   false;
this.MinimizeBox   =   false;
this.Name   =   "Form1";
this.Text   =   "GoodView   test   Web   Camera";
this.Load   +=   new   System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

///  
///   应用程序的主入口点。
///  
[STAThread]
static   void   Main()  
{
Application.Run(new   Form1());
}

private   void   form1_load(object   sender,   system.eventargs   e)
{
b_play.Enabled   =   false;
b_stop.Enabled   =   true;
panelPreview.Size   =   new   Size(330,330);
wc   =   new   WebCamera(   panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();
}

private   void   button1_click(object   sender,   system.eventargs   e)
{
b_play.Enabled   =   false;
b_stop.Enabled   =   true;
panelPreview.Size   =   new   Size(330,330);
wc   =   new   WebCamera(   panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();
}

private   void   b_stop_click(object   sender,   system.eventargs   e)
{
b_play.Enabled   =   true;
b_stop.Enabled   =   false;
wc.CloseWebcam();
}
}
}