UWP视频流位图操作

时间:2018-07-03 09:17:37

标签: c# uwp video-processing

我从https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/custom-video-effects

编写了示例

部分代码:

public void ProcessFrame(ProcessVideoFrameContext context)
    {

        using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(canvasDevice, context.InputFrame.Direct3DSurface))
        using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
        using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
        {

            var gaussianBlurEffect = new GaussianBlurEffect
            {
                Source = inputBitmap,
                BlurAmount = (float)BlurAmount,
                Optimization = EffectOptimization.Speed
            };

            ds.DrawImage(gaussianBlurEffect);
        }
    }

问题是:我想在框架上绘制点(位图),但是我不知道如何将特定的坐标传递给ProcessFrame函数。在输入时,对于要在其中绘制点的每一帧,我都有x和y坐标,而在输出中,我希望每帧都具有添加点的视频。 感谢您的帮助。Frame before processing Frame after processing

1 个答案:

答案 0 :(得分:1)

编辑: 下面的代码不适用于解决方案,因为ProcessFrame(ProcessVideoFrameContext context)是接口实现的一部分。

我的下一个解决方案建议是创建自定义效果,类似于GaussianBlusEffect等。一个例子:

https://github.com/Microsoft/Win2D-Samples/blob/master/ExampleGallery

~~~ 在原始答案下面供参考。

您可以传入X和Y参数并访问图像的像素。

public void ProcessFrame(ProcessVideoFrameContext context, int X, int Y)
    {

    using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(canvasDevice, context.InputFrame.Direct3DSurface))
    using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
    using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
    {

        Color[] Pixels = inputBitmap.GetPixelColors();
        // Manipulate the array using X and Y with the Width parameter of the bitmap

        var gaussianBlurEffect = new GaussianBlurEffect
        {
            Source = inputBitmap,
            BlurAmount = (float)BlurAmount,
            Optimization = EffectOptimization.Speed
        };

        ds.DrawImage(gaussianBlurEffect);
    }
}

更多信息:https://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasBitmap_GetPixelColors.htm

我没有检查Color []是否是指向活动缓冲区或副本的指针。如果是副本,则必须使用SetPixelColors回写缓冲区。