摄像头编程 
安装摄像头后,一般可以找到一个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();
}
}
}

c#摄像头编程实例 (转)的更多相关文章

  1. Android手机摄像头编程入门

    本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制, 做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别, ...

  2. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  3. JAX-RS 2.0 REST客户端编程实例

    JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...

  4. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  5. hadoop2.2编程:使用MapReduce编程实例(转)

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...

  6. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  7. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  8. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  9. The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

随机推荐

  1. setTimeout的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Flex 监听浏览器关闭

    在creationComplete的事件中,添加如下: if(ExternalInterface.available)//外部接口是否可用    {     var js:String= " ...

  3. [摘抄]iOS App icon、启动页、图标规范

    以下内容都是我在做App时通过自己的经验和精品的分析得来的,希望会帮助到你.但是有时个别情况也要个别分析,要活学活用. 一. App  Icon 在设计iOS App Icon时,设计师不需要切圆角, ...

  4. Apache2.4.6服务器安装及配置

    一.系统环境 系统版本:Aliyun Linux release 5.7 内核版本:2.6.18-274.el5 apr版本:apr-1.4.8 apr-util版本:apr-util-1.5.2 p ...

  5. Tomcat 在mac中Operation not permitted

    5.执行/Library/Tomcat/bin下的startup.sh,然后打开http://localhost:8080查看是否Tomcat已经启动,若要停止服务器就运行同目录下的shutdown. ...

  6. new 与 malloc 的区别

    1, 申请内存所在的位置 new 操作符从自由存储区上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存.自由存储区是C++基于 new 操作符的一个抽象概念,而堆是操作系统中的术语,是 ...

  7. [THINKING IN JAVA]操作符

    3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...

  8. android 学习资源总结

    http://android-arsenal.com/free   国外的android分类资源网站 http://www.ibm.com/developerworks/cn/topics/   IB ...

  9. HotSpotOverview.pdf

    从oracle官网下载的这个HotSpot虚拟机的概况文档,现在翻一下锁的部分: Java 锁 *每一个java对象都是一个潜在的monitor(监视器) >synchronized 关键字 * ...

  10. Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...