我从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坐标,而在输出中,我希望每帧都具有添加点的视频。 感谢您的帮助。
答案 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回写缓冲区。