我正在制作一个应用程序,该应用程序将在内置两个网络摄像头的平板电脑设备上运行。其中一个要求是能够捕获图像并保存它们。
到目前为止,我已经能够使用此代码
预览网络摄像头的输出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面板。
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
如果你想要捕获的窗口上有一个窗口,那么捕获将是一个覆盖窗口的图像,或者如果你最小化窗口发生相同,你将捕获一个coordenates的截图。此方法是使用coordenates捕获屏幕。
如何成为流式传输的捕获图像?