C# 使用 DirectShow 捕获摄像头图像并保存为图片
要在 C# 中使用 DirectShow 调用摄像头并进行截图,可以按照以下步骤进行:
-
首先,需要安装 DirectShow 库。可以从 Microsoft 的官方网站上下载并安装 DirectX SDK (https://www.microsoft.com/en-us/download/details.aspx?id=6812)。
-
在项目中添加对 DirectShow 的引用。在 Visual Studio 中,右键单击项目,选择“添加引用”,然后选择“COM”选项卡,找到并选择“DirectShowLib”组件。
-
创建一个 DirectShow 设备对象并选择摄像头。可以使用
DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)方法获取所有可用的视频输入设备列表,并选择其中一个摄像头。DsDevice[] videoDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); if (videoDevices.Length == 0) { Console.WriteLine('No video input devices found.'); return; } // 选择第一个摄像头 DsDevice videoDevice = videoDevices[0]; -
创建一个 FilterGraph 对象并将设备添加到图形中。
FilterGraph filterGraph = new FilterGraph(); IBaseFilter captureFilter = videoDevice.BindToObject(null, null, typeof(IBaseFilter).GUID) as IBaseFilter; filterGraph.AddFilter(captureFilter, 'Capture Filter'); -
创建 SampleGrabber 对象用于捕获图像。
ISampleGrabber sampleGrabber = new SampleGrabber() as ISampleGrabber; filterGraph.AddFilter(sampleGrabber as IBaseFilter, 'Sample Grabber'); -
配置 SampleGrabber 对象以便捕获图像。
AMMediaType mediaType = new AMMediaType(); mediaType.majorType = MediaType.Video; mediaType.subType = MediaSubType.RGB24; mediaType.formatType = FormatType.VideoInfo; sampleGrabber.SetMediaType(mediaType); -
连接 FilterGraph 中的滤镜。
filterGraph.ConnectDirect(GetPin(captureFilter, 'Capture'), GetPin(sampleGrabber as IBaseFilter, 'Input'), null); -
启动 FilterGraph。
IMediaControl mediaControl = filterGraph as IMediaControl; mediaControl.Run(); -
在 SampleGrabber 的回调函数中获取图像数据。
SampleGrabberCallback callback = new SampleGrabberCallback(); sampleGrabber.SetCallback(callback, 1);public class SampleGrabberCallback : ISampleGrabberCB { public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) { // 从缓冲区获取图像数据 byte[] imageData = new byte[BufferLen]; Marshal.Copy(pBuffer, imageData, 0, BufferLen); // 保存图像数据为图片 Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); Marshal.Copy(imageData, 0, bmpData.Scan0, BufferLen); bitmap.UnlockBits(bmpData); bitmap.Save('screenshot.bmp'); return 0; } // 省略其他接口方法的实现 } -
最后,停止 FilterGraph 并释放资源。
mediaControl.Stop(); filterGraph.RemoveAllFilters(); Marshal.ReleaseComObject(sampleGrabber); Marshal.ReleaseComObject(captureFilter); Marshal.ReleaseComObject(filterGraph);
请注意,以上代码只是一个简单的示例,可能还需要进行一些错误处理和其他的配置。完整的代码示例可以在 DirectShowLib 库的示例项目中找到 (https://github.com/rdp/directshow-net)。
原文地址: https://www.cveoy.top/t/topic/qqOK 著作权归作者所有。请勿转载和采集!