directshow.net网络摄像头覆盖透明面板

时间:2011-10-10 09:48:27

标签: c# .net winforms directshow.net

我正在尝试使用网络摄像头为徽章拍照。为了做到这一点,我使用了directshow.net库和示例,根据DxSnap示例,这让我在一个图片框中呈现了一个.NET网络摄像头预览屏幕。我现在希望用可移动和可调整大小的矩形(锁定的宽高比)覆盖它,以便最终用户将其拖到人身上以在适当的点从网络摄像头拍摄图像。所以它看起来像这样:

Example Image

要做到这一点,我认为没问题,将网络摄像头信号源放入一个图片框中,我将用透明面板或相框覆盖它,并使用普通的.NET代码在那里制作一个矩形。如果我覆盖普通面板,它会出现在directshow网络摄像头输出上方,如预期的那样。但是,如果我使用这个技巧来实现透明面板或图片框:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
        return createParams;
    }
}

protected override void OnPaintBackground(PaintEventArgs e)
{
   // Do not paint background.
}

不幸的是,它出现在directshow输出下面。有没有一种简单的方法来解决这个或另一种方法。如果可以避免的话,我宁愿不深入研究directshow.net,我认为这将是一种避免它的简单方法。

2 个答案:

答案 0 :(得分:1)

我最终使用的是AForge.NET项目而不是DirectShow.NET。它有一些非常好的样本,并且其视频输出的绘制就像处理其视频播放器OnPaint事件一样简单,因为它为每个帧调用它。它似乎需要更多的CPU,但没有太多的负担。

答案 1 :(得分:0)

重叠的问题是视频以不同于常规GUI图形的方式显示,通过特定方法在视频适配器上创建非RGB表面(通常)。因此,您不能将视频与窗口重叠,也不能直接使用GDI。

您仍然可以在途中修改视频,或使用特殊调音台覆盖视频。

请参阅此问题:Showing a semi-transparent Image object over an IVideoWindow in C# using DirectShow.NET,因为它讨论了类似的请求。