Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft Expression Encoder SDK捕获静止图像_C#_Webcam_Screen Capture_Expression Encoder Sdk - Fatal编程技术网

C# 使用Microsoft Expression Encoder SDK捕获静止图像

C# 使用Microsoft Expression Encoder SDK捕获静止图像,c#,webcam,screen-capture,expression-encoder-sdk,C#,Webcam,Screen Capture,Expression Encoder Sdk,我在玩我的网络摄像头,并开始创建一个小应用程序(使用Microsoft Expression Encoder SDK),其中网络摄像头的图像流式传输到winform上的picturebox[1]。到目前为止,一切都很顺利。但现在我的问题开始了: 我想捕获视频流的单个图像并存储它。我找到了“ScreenCaptureJob”类,它可以创建视频文件。微软的MSDN声明,可以“从对话框的静止图像中捕获任何内容”[2]来完成视频。MSDN中的所有示例都涉及视频捕获。不幸的是,我找不到任何解决方案如何使用

我在玩我的网络摄像头,并开始创建一个小应用程序(使用Microsoft Expression Encoder SDK),其中网络摄像头的图像流式传输到winform上的picturebox[1]。到目前为止,一切都很顺利。但现在我的问题开始了:

我想捕获视频流的单个图像并存储它。我找到了“ScreenCaptureJob”类,它可以创建视频文件。微软的MSDN声明,可以“从对话框的静止图像中捕获任何内容”[2]来完成视频。MSDN中的所有示例都涉及视频捕获。不幸的是,我找不到任何解决方案如何使用这个类来捕获单个图像

有人能帮我吗

[1] 将网络摄像头传输到图片框的代码(来源:)

var lstVideoDevices=新字典();
var lstudiodevices=新字典();
foreach(EncoderDevices.FindDevices(EncoderDeviceType.Video)中的EncoderDevice edv)
{
lstVideoDevices.Add(edv.Name,edv);
}
foreach(EncoderDevices.FindDevices(EncoderDeviceType.Audio)中的EncoderDevice eda)
{
lstudiodevices.Add(eda.Name,eda);
}
_作业=新
var _deviceSource=_job.AddDeviceSource(lstVideoDevices.Values.FirstOrDefault(x=>x.Name.Contains(“USB”)),lstAudioDevices.Values.FirstOrDefault(x=>x.Name.Contains(“USB”);
_deviceSource.PreviewWindow=新的PreviewWindow(新的HandleRef(this.pictureBox1,this.pictureBox1.Handle));
_job.ActivateSource(_deviceSource)`

[2]

我不确定是否可以使用Microsoft Expression Encoder SDK,它的文档记录似乎很差

但是您可以使用函数来代替

只需使用
capCreateCaptureWindow
函数创建一个预览窗口,然后通过发送
WM\u CAP\u SET\u callback\u frame
消息注册帧回调:

/* imports */
[DllImport("user32", EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

/* ... */
capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE | showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);

SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, handler);
你可以找到C#示例和


如果您想知道如何使用Expression Encoder实现这一点,请告诉我。

您可以使用该库进行静态捕获,但这似乎有点困难。(我仍在寻找更好的解决方案)我发现基本解决方案的一个例子是弹出一个预览窗口,然后使用相同尺寸的图形对象,使用CopyFromScreen()获取文件

你可以,但这似乎有点混乱。我发现一个基本解决方案就是弹出一个预览窗口。然后,使用相同尺寸的图形对象,使用CopyFromScreen()获取文件。代码如下:

using (Bitmap bitmap = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height))
   { 
   using (Graphics g = Graphics.FromImage(bitmap))
    {
        // Get the paramters to call g.CopyFromScreen and get the image
        Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
        Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
        g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
    }
    bitmap.Save(....)
    }
using (Bitmap bitmap = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height))
   { 
   using (Graphics g = Graphics.FromImage(bitmap))
    {
        // Get the paramters to call g.CopyFromScreen and get the image
        Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
        Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
        g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
    }
    bitmap.Save(....)
    }