C#利用VFW实现摄像头程序
最近在搞这个考试监控,找来VFW的资料,胡编乱凑而成。
VFW全称为Video for Windows,是微软提供的,内嵌windows系统。
首先定义一个VideoAPI类。
首先调用avicap32.dll
[DllImport("avicap32.dll")]
public static extern IntPtr capCreateCaptureWindow(byte[] strWindowName, int dwStyle, int x, int y, int width, int height, IntPtr hwdParent, int nID);
[DllImport("avicap32.dll")]
public static extern bool capGetDriverDescription(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);
再调用User32.dll
[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, int wParam, string lParam);
再定义一堆消息。
//常量
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 + ;
public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + ;
public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + ;
public const int WM_CAP_SET_PREVIEW = WM_USER + ;
public const int WM_CAP_SET_PREVIEWRATE = WM_USER + ;
public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + ;
public const int WM_CAP_START = WM_USER;
public const int WM_CAP_SAVEDIB = WM_CAP_START + ;
public const int WM_CAP_SET_SCALE = WM_USER + ;
public const int WM_COPYTOCLIPBORAD = WM_USER + ;
public const int WM_CAP_SEQUENCE = WM_USER + ;
public const int WM_CAP_FILE_SET_CAPTURE_FILE = WM_USER + ;
public const int WM_CAP_STOP = WM_USER + ;
定义一个VideoClass,用于调用API,启动摄像头,关闭摄像头,保存图片等。
启动摄像头:
public bool StartWebcam()
{
byte[] lpszName = new byte[];
byte[] lpszVer = new byte[];
VideoAPI.capGetDriverDescription(, lpszName, , lpszVer, ); caphwnd = VideoAPI.capCreateCaptureWindow(lpszName, VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, , , this.width, this.height, this.controlhwnd, ); if (caphwnd == null)
{
return false;
} bool isconnect = VideoAPI.SendMessage(caphwnd,VideoAPI.WM_CAP_DRIVER_CONNECT,,);
if(isconnect == false)
{
VideoAPI.CloseHandle(caphwnd);
return false;
} if (VideoAPI.SendMessage(caphwnd, VideoAPI.WM_CAP_SET_PREVIEWRATE, , ) == false)
{
return false;
} if (VideoAPI.SendMessage(caphwnd, VideoAPI.WM_CAP_SET_PREVIEW, true, ) == false)
{
return false;
} if (VideoAPI.SendMessage(caphwnd, VideoAPI.WM_CAP_SET_SCALE, , ) == false)
{
return false;
} isstart = true;
return true;
}
关闭摄像头:
/// <summary>
/// 关闭视频设备
/// </summary>
/// <returns></returns>
public bool StopWebcam()
{
if (caphwnd != null)
{
isstart = false;
return VideoAPI.SendMessage(caphwnd, VideoAPI.WM_CAP_DRIVER_DISCONNECT, , );
}
else
return false;
}
截图:
public bool GrabImage(IntPtr hWndC, string path)
{
if (caphwnd != null)
return VideoAPI.SendMessage(caphwnd, VideoAPI.WM_CAP_SAVEDIB, , path);
else
return false;
} public bool SaveImage(string path)
{
return GrabImage(this.caphwnd, path);
}
截图并转换为jpg:
public void CopyToClipBorad()
{
VideoAPI.SendMessage(caphwnd, VideoAPI.WM_COPYTOCLIPBORAD, , );
} public System.Drawing.Image getCaptureImage()
{
System.Windows.Forms.IDataObject iData = System.Windows.Forms.Clipboard.GetDataObject();
System.Drawing.Image retImage = null;
if (iData != null)
{
if (iData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap))
{
retImage = (System.Drawing.Image)iData.GetData(System.Windows.Forms.DataFormats.Bitmap);
}
else if (iData.GetDataPresent(System.Windows.Forms.DataFormats.Dib))
{
retImage = (System.Drawing.Image)iData.GetData(System.Windows.Forms.DataFormats.Dib);
}
}
return retImage;
}
在调用类中写:
public void capture(string strname)
{
vc.CopyToClipBorad();
System.Drawing.Image img = vc.getCaptureImage();
img.Save(strname, System.Drawing.Imaging.ImageFormat.Jpeg);
}
附上视频类和控件:http://files.cnblogs.com/qiu2013/MyWebcam.zip
C#利用VFW实现摄像头程序的更多相关文章
- Jenkins简明入门(二) -- 利用Jenkins完成Python程序的build、test、deployment
大家可能还没搞清楚,Jenkins到底能做什么? 本节内容利用Jenkins完成python程序的build.test.deployment,让大家对Jenkins能做的事情有一个直观的了解. 本节内 ...
- Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示
1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...
- 编写高质量代码改善C#程序的157个建议——建议156:利用特性为应用程序提供多个版本
建议156:利用特性为应用程序提供多个版本 基于如下理由,需要为应用程序提供多个版本: 应用程序有体验版和完整功能版. 应用程序在迭代过程中需要屏蔽一些不成熟的功能. 假设我们的应用程序共有两类功能: ...
- 利用msfvenom制作木马程序(你可以得到她的一切)
实验环境: 虚拟机:kali (攻击机) 192.168.1.2 虚拟机:windwos 2003 (靶机) 192.168.1.100 1. 制作木马 说明: -p payl ...
- C# 利用AForge进行摄像头信息采集
概述 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人 ...
- 利用manifest文件对程序目录下的dll进行分类
1 背景 对于大部分的券商和机构投资者,只能通过有交易所交易系统接入资质的券商提供的柜台系统来进行现货交易.相对于期货市场,现货市场的柜台系统千差万别,接入协议有明文字符串.二进制数据和FIX协议等, ...
- php利用svn hooks将程序自动发布到测试环境
利用svn hooks将php程序自动发布到测试环境 复制仓库hooks目录下的post-commit.tmpl为post-commit cp post-commit.tmpl post-commit ...
- android利用数字证书对程序签名
签名的必要性 1. 防止你已安装的应用被恶意的第三方覆盖或替换掉. 2. 开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同 ...
- android 利用数字证书对程序签名
签名的必要性 1. 防止你已安装的应用被恶意的第三方覆盖或替换掉. 2. 开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样 ...
随机推荐
- 复式记账中"借"与"贷"的理解
财务常识中,复式记账法应用极广,公司采用的是它的借贷记账法.因此,深刻的理解"借"与"贷"的含义极其重要. 一切从历史说起. 起源: Credit 英文含义 ...
- Http之基础
简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/I ...
- 第一个C#程序Hello World
一.编写第一个C#程序——Hello World1. 启动Microsoft Visual Studio 2010.2. 点击“文件”菜单,选择“新建”项,在弹出的子菜单中选择“项目”命令.3. 弹出 ...
- Oracle 将 A 用户下所有表的增删改查 赋予 B 用户
第一步:创建用户 create user username identified by password; 第二步:给用户赋值接触锁定(仅仅赋予会话权限) grant create session t ...
- MySQL如何计算重要的指标,来确定配置是否正确
在调优MySQL数据库和监控数据库时,很多朋友不知道如何下手,怎么来确定是不是参数设置的合理,下面给出一些如何计算指标,来确定数据库参数是否设置合理,希望给大家一些方法,去做MySQL数据库优化,最好 ...
- Servlet学习笔记02——什么是http协议?
1.http协议 (了解) (1)什么是http协议? 是一种网络应用层协议,规定了浏览器与web服务器之间 如何通信以及相应的数据包的结构. 注: a.tcp/ip: 网络层协议,可以保证数据可靠的 ...
- Mysql: pt-table-checksum 和 pt-table-sync 检查主从一致性,实验过程
一.安装 percona 包 1.安装仓库的包 https://www.percona.com/doc/percona-repo-config/yum-repo.html sudo yum insta ...
- python3 井字棋 GUI - 人机对战、机器对战 (threading、tkinter库)
python3 井字棋 GUI - 人机对战.机器对战 功能 GUI界面 人机对战(可选择机器先走) 机器对战(50局) 流程图 内核 棋盘 [0][1][2] [3][4][5] [6][7][8] ...
- nginx虚拟主机搭建
nginx [engine x]是 Igor Sysoev 编写的一个 HTTP 和反向代理服务器,另外它也可以 作为邮件代理服务器. 它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括 ...
- python网络爬虫入门范例
python网络爬虫入门范例 Windows用户建议安装anaconda,因为有些套件难以安装. 安装使用pip install * 找出所有含有特定标签的HTML元素 找出含有特定CSS属性的元素 ...