UWP 视频流位图操作

UWP video stream bitmaps manipulation

我从 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 坐标,在输出上,我想要为每一帧添加点的视频。 感谢您的帮助。

编辑: 下面的代码不是合适的解决方案,因为 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 写回缓冲区。