2

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

示例图像

为此,我认为没问题,将网络摄像头源放入图片框中,我将用透明面板或相框覆盖它,并使用普通的 .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,我认为这是避免它的简单方法。

4

2 回答 2

1

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

于 2011-10-14T10:58:21.980 回答
0

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

您仍然可以在途中修改视频,或使用特殊的混音器叠加视频。

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

于 2011-10-12T09:47:42.207 回答