0

我正在制作一个将在内置两个网络摄像头的平板设备上运行的应用程序。其中一个要求是能够捕获图像并保存它们。

到目前为止,我已经能够使用此代码获得网络摄像头输出的预览

Dim Job As New LiveJob
Dim source As LiveDeviceSource
source = Job.AddDeviceSource(EncoderDevices.FindDevices(EncoderDeviceType.Video).Item(0), Nothing)

source.PreviewWindow = New PreviewWindow(New HandleRef(Me.panPreview, Me.panPreview.Handle))

Job.ActivateSource(source)

这将在托管的 winforms 面板中显示预览。问题是如何从这个流中捕获图像并返回一个新的图像对象以供以后处理?

我尝试使用 RenderTargetBitmap 捕获 winforms 主机,但只返回一个黑色矩形,它不会让我渲染 winforms 面板。

4

2 回答 2

0

刚刚在代码项目中找到了这块宝石。这里是代码。这里 panelVideoPreview 是您的预览,即 panPreview 窗口。希望这可以帮助。

private void cmdGrabImage_Click(object sender, EventArgs e)        
{
// Create a Bitmap of the same dimension of panelVideoPreview (Width x Height)
    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); 
        }
        string strGrabFileName = String.Format("C:\\Snapshot_{0:yyyyMMdd_hhmmss}.jpg", DateTime.Now);
        toolStripStatusLabel1.Text = strGrabFileName;
        bitmap.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Jpeg);                
    }
}
于 2011-10-25T07:50:23.147 回答
0

如果您要捕获的窗口上方有一个窗口,则捕获将是窗口上方的图像,或者如果您最小化窗口发生相同的情况,您将捕获坐标的屏幕截图。此方法是使用坐标捕获屏幕。

流媒体的捕获图像如何?

于 2012-03-04T17:43:25.990 回答