如何控制摄像头

<一>

using   System; 
using   System.Collections.Generic; 
using   System.Text; 
using   System.Runtime.InteropServices; 

namespace   WindowsApplication1 

        
public   class   VideoWork 
        

                
private   const   int   WM_USER   =   0x400
                
private   const   int   WS_CHILD   =   0x40000000
                
private   const   int   WS_VISIBLE   =   0x10000000
                
private   const   int   WM_CAP_START   =   WM_USER; 
                
private   const   int   WM_CAP_STOP   =   WM_CAP_START   +   68
                
private   const   int   WM_CAP_DRIVER_CONNECT   =   WM_CAP_START   +   10
                
private   const   int   WM_CAP_DRIVER_DISCONNECT   =   WM_CAP_START   +   11
                
private   const   int   WM_CAP_SAVEDIB   =   WM_CAP_START   +   25
                
private   const   int   WM_CAP_GRAB_FRAME   =   WM_CAP_START   +   60
                
private   const   int   WM_CAP_SEQUENCE   =   WM_CAP_START   +   62
                
private   const   int   WM_CAP_FILE_SET_CAPTURE_FILEA   =   WM_CAP_START   +   20
                
private   const   int   WM_CAP_SEQUENCE_NOFILE   =   WM_CAP_START   +   63
                
private   const   int   WM_CAP_SET_OVERLAY   =   WM_CAP_START   +   51
                
private   const   int   WM_CAP_SET_PREVIEW   =   WM_CAP_START   +   50
                
private   const   int   WM_CAP_SET_CALLBACK_VIDEOSTREAM   =   WM_CAP_START   +   6
                
private   const   int   WM_CAP_SET_CALLBACK_ERROR   =   WM_CAP_START   +   2
                
private   const   int   WM_CAP_SET_CALLBACK_STATUSA   =   WM_CAP_START   +   3
                
private   const   int   WM_CAP_SET_CALLBACK_FRAME   =   WM_CAP_START   +   5
                
private   const   int   WM_CAP_SET_SCALE   =   WM_CAP_START   +   53
                
private   const   int   WM_CAP_SET_PREVIEWRATE   =   WM_CAP_START   +   52
                
private   IntPtr   hWndC; 
                
private   bool   bWorkStart   =   false
                
private   IntPtr   mControlPtr; 
                
private   int   mWidth; 
                
private   int   mHeight; 
                
private   int   mLeft; 
                
private   int   mTop; 


                
/**/ 
                
///   <summary > 
                
///   初始化显示图像 
                
///   </summary > 
                
///   <param   name= "handle " >控件的句柄 </param > 
                
///   <param   name= "left " >开始显示的左边距 </param > 
                
///   <param   name= "top " >开始显示的上边距 </param > 
                
///   <param   name= "width " >要显示的宽度 </param > 
                
///   <param   name= "height " >要显示的长度 </param > 

                public   VideoWork(IntPtr   handle,   int   left,   int   top,   int   width,   int   height) 
                

                        mControlPtr   
=   handle; 
                        mWidth   
=   width; 
                        mHeight   
=   height; 
                        mLeft   
=   left; 
                        mTop   
=   top; 
                }
 

                [DllImport( 
"avicap32.dll ")] 
                
private   static   extern   IntPtr   capCreateCaptureWindowA(byte[]   lpszWindowName,   int   dwStyle,   int   x,   int   y,   int   nWidth,   int   nHeight,   IntPtr   hWndParent,   int   nID); 

                [DllImport( 
"avicap32.dll ")] 
                
private   static   extern   int   capGetVideoFormat(IntPtr   hWnd,   IntPtr   psVideoFormat,   int   wSize); 

                
// 
                
//这里特别注意,因为WinAPI中的long为32位,而C#中的long为64wei,所以需要将lParam该为int 
                
// 
                [DllImport( "User32.dll ")] 
                
private   static   extern   bool   SendMessage(IntPtr   hWnd,   int   wMsg,   int   wParam,   int   lParam); 

                
/**/ 
                
///   <summary > 
                
///   开始显示图像 
                
///   </summary > 

                public   void   Start() 
                

                        
if   (bWorkStart) 
                                
return

                        bWorkStart   
=   true
                        
byte[]   lpszName   =   new   byte[100]; 

                        hWndC   
=   capCreateCaptureWindowA(lpszName,   WS_CHILD   ¦   WS_VISIBLE,   mLeft,   mTop,   mWidth,   mHeight,   mControlPtr,   0); 

                        
if   (hWndC.ToInt32()   !=   0
                        

                                SendMessage(hWndC,   WM_CAP_SET_CALLBACK_VIDEOSTREAM,   
0,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_CALLBACK_ERROR,   
0,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_CALLBACK_STATUSA,   
0,   0); 
                                SendMessage(hWndC,   WM_CAP_DRIVER_CONNECT,   
0,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_SCALE,   
1,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_PREVIEWRATE,   
66,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_OVERLAY,   
1,   0); 
                                SendMessage(hWndC,   WM_CAP_SET_PREVIEW,   
1,   0); 
                                
//Global.log.Write( "SendMessage "); 
                        }
 
                        
return

                }
 
                
/**/ 
                
///   <summary > 
                
///   停止显示 
                
///   </summary > 

                public   void   Stop() 
                

                        SendMessage(hWndC,   WM_CAP_DRIVER_DISCONNECT,   
0,   0); 
                        bWorkStart   
=   false
                }
 

                
/**/ 
                
///   <summary > 
                
///   抓图 
                
///   </summary > 
                
///   <param   name= "path " >要保存bmp文件的路径 </param > 

                public   void   GrabImage(string   path) 
                

                        IntPtr   hBmp   
=   Marshal.StringToHGlobalAnsi(path); 
                        SendMessage(hWndC,   WM_CAP_SAVEDIB,   
0,   hBmp.ToInt32()); 
                }
 
        }
 
}

调用的代码是:  
VideoWork   wv   
=   new   VideoWork(panel1.Handle,   0,   0,   panel1.Width,   panel1.Height); 
wv.Start();

<二>

 

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     );   
  }
   
    
  
windows     窗体设计器生成的代码   
    
  
///       
  
///     应用程序的主入口点。   
  
///       

  [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();   
  }
   
  }
   
  }
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值