.Net里一个用于驱动摄像头的类

本文是借助avicap32.dll库来驱动摄像头。做到了抓图、录像功能。

 

using  System;
using  System.Runtime.InteropServices;
using  System.Drawing;
using  System.Drawing.Imaging;

namespace   using  System;
using  System.Runtime.InteropServices;
using  System.Drawing;
using  System.Drawing.Imaging;

namespace  PickHead
{
///   <summary>
///  一个控制摄像头的类
///   </summary>
public   class  Pick
{
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  bStat  =   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  Pick(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 );
[DllImport(
" User32.dll " )] 
private   static   extern   bool  SendMessage(IntPtr hWnd,  int  wMsg,  int  wParam,  long  lParam);

///   <summary>
///  开始显示图像
///   </summary>
public   void  Start()
{
if  (bStat)
return ;

bStat 
=   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 );
}

return ;

}

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


///   </summary>
public   void  Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 
0 0 );
bStat 
=   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.ToInt64());

}

///   <summary>
///  录像
///   </summary>
///   <param name="path"> 要保存avi文件的路径 </param>
public   void  Kinescope( string  path)
{
IntPtr hBmp 
=  Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,
0 ,hBmp.ToInt64());
SendMessage(hWndC, WM_CAP_SEQUENCE, 
0 0 );
}

///   <summary>
///  停止录像
///   </summary>
public   void  StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, 
0 0 );
}

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值