C#打开摄像头抓取照片然后退出
2013-08-27 10:08 沐海 阅读(3950) 评论(0) 编辑 收藏 举报using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespace MyVideoService { class Program { static void Main(string[] args) { cVideo video = new cVideo(Process.GetCurrentProcess().MainWindowHandle, 379, 316); video.StartWebCam(); video.GrabImage(Process.GetCurrentProcess().MainWindowHandle, "d:\\b.jpg"); video.CloseWebcam(); } } }
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Drawing; using System.IO; namespace MyVideoService { public class VideoAPI //视频API类 { // 视频API调用 [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); // 常量 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; public const int WM_CAP_START = WM_USER; public const int WM_CAP_SAVEDIB = WM_CAP_START + 25; } public class cVideo //视频类 { private IntPtr lwndC; //保存无符号句柄 private IntPtr mControlPtr; //保存管理指示器 private int mWidth; private int mHeight; public cVideo(IntPtr handle, int width, int height) { mControlPtr = handle; //显示视频控件的句柄 mWidth = width; //视频宽度 mHeight = height; //视频高度 } /// <summary> /// 打开视频设备 /// </summary> public void StartWebCam() { byte[] lpszName = new byte[100]; byte[] lpszVer = new byte[100]; VideoAPI.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100); this.lwndC = VideoAPI.capCreateCaptureWindowA(lpszName, VideoAPI.WS_CHILD | VideoAPI.WS_VISIBLE, 0, 0, mWidth, mHeight, mControlPtr, 0); if (VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_CONNECT, 0, 0)) { VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEWRATE, 100, 0); VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SET_PREVIEW, true, 0); } } /// <summary> /// 关闭视频设备 /// </summary> public void CloseWebcam() { VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_DRIVER_DISCONNECT, 0, 0); } /// <summary> /// 拍照 /// </summary> /// <param name="path">要保存jpeg文件的路径</param> public void GrabImage(IntPtr hWndC, string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32()); Bitmap image = new Bitmap(path); if (path.Contains("bmp")) { image.Save(path.Replace("bmp", "jpg"), ImageFormat.Jpeg); image.Dispose(); if (System.IO.File.Exists(path)) { try { System.IO.File.Delete(path); } catch (System.IO.IOException e) { return; } } else { image.Save(path, ImageFormat.Jpeg); image.Dispose(); } } } } }
补上这一个,是因为在VFW的系列教程中有人反映截图的问题。 我原来的方案是btye转换。 现在通过dll直接做byte的图片输入。 更方便。
VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());
这个文章来源: 开源中国。 转帖是北洋螃蟹。
本人声明:
个人主页:沐海(http://www.cnblogs.com/mahaisong)
以上文章都是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言或加我QQ!欢迎交流!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2011-08-27 VFW 结构 综合