最近我学习UWP并试图构建一个简单的演示,我只想生成一个简单的实时模糊效果,如Aero。它有时有用(eg.real时相机过滤器),所以我做了一个想法是这样的:如何将活动gaussain模糊效果应用于UWP应用程序?
首先,我进口win2D库,并放置在CanvasAnimatedControl在RootGrid:
<canvas:CanvasAnimatedControl x:Name="BlurLayer" Draw="BlurLayer_Draw"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
的资源这个模糊层是一个框架:
<Frame x:Name="MainFrame" LayoutUpdated="MainFrame_LayoutUpdated"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
和每帧已更新时,MainFrame_LayoutUpdated方法尝试保存一个使用RenderTargetBitmap的快捷方式,但是,win2D无法将其作为CanvasBitmap接收到此对象,因此将其转换为byte []并保存;
RenderTargetBitmap renderer = new RenderTargetBitmap();
CanvasBitmap bitmap;
byte[] RendererStream;
public static int FrameWidth;
public static int FrameHeight;
public ICanvasImage RenderFinal;
public bool Frame_Updated = false;
private async void MainFrame_LayoutUpdated(object sender, object e)
{
await renderer.RenderAsync(MainFrame);
FrameWidth = renderer.PixelWidth;
FrameHeight = renderer.PixelHeight;
RendererStream = WindowsRuntimeBufferExtensions.ToArray(await renderer.GetPixelsAsync());
if (FrameHeight != 0)
Frame_Updated = true;
}
在BlurLayer_Draw方法,只刷新并应用模糊效果: 私人无效BlurLayer_Draw(ICanvasAnimatedControl发件人,
CanvasAnimatedDrawEventArgs args)
{
if (Frame_Updated)
{
bitmap = CanvasBitmap.CreateFromBytes(sender, RendererStream, FrameWidth, FrameHeight, DirectXPixelFormat.B8G8R8A8UIntNormalized);
RenderFinal = new GaussianBlurEffect
{
Source = bitmap
};
RenderFinal.BorderMode = EffectBorderMode.Hard;
RenderFinal.BlurAmount = 8.0f;
Frame_Updated = false;
}
if (RenderFinal != null)
args.DrawingSession.DrawImage(RenderFinal);
}
当这一切完成后,它的工作 但这种方法真的。可怕的是,win2D Canvas被严重延迟了。 因此,我应该怎么做才能使其性能更高?
也许SharpDX可能会帮助你? http://sharpdx.org/documentation/api/t-sharpdx-direct2d1-effects-gaussianblur它使用DirectX,应该更高性能。 – sibbl
我有一篇关于Lumia Imaging SDK真正快速模糊的博客文章http://igrali.com/2015/09/26/using-swapchainpanelrenderer-to-improve-real-time-rendering-in-lumia-imaging-sdk- 3 /和该项目也在GitHub https://github.com/igrali/PropertyDescriptions可能会帮助你! –
@sibbl我想尝试一下。 – EmbraceZXS