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 写回缓冲区。
我从 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 写回缓冲区。