2015-11-08 54 views
3

最近我学习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被严重延迟了。 因此,我应该怎么做才能使其性能更高?

+0

也许SharpDX可能会帮助你? http://sharpdx.org/documentation/api/t-sharpdx-direct2d1-effects-gaussianblur它使用DirectX,应该更高性能。 – sibbl

+0

我有一篇关于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可能会帮助你! –

+0

@sibbl我想尝试一下。 – EmbraceZXS

回答

1

让我的c省略官方答案:使用Lumia Imaging SDK。它具有BlurEffect,如果使用SwapChainPanelRenderer进行实时渲染,它的速度非常快。我在我的博客文章Using SwapChainPanelRenderer to improve real-time rendering in Lumia Imaging SDK 3中写了一篇关于它的文章,我用BlurEffect作为例子。完整的源代码是available on GitHub

只要模糊KernelSize值更改为新的滑块值,就可以在SwapChainPanelRenderer实例上调用RenderAsync

private async void EffectRangeSlider_OnValueChanged(object sender, RangeBaseValueChangedEventArgs e) 
{ 
    if (this.renderer != null) 
    { 
     this.viewModel.blur.KernelSize = (int)e.NewValue; 

     await this.renderer.RenderAsync(); 
    } 
} 
0

如果您想要,还可以使用Windows 10 Anniversary更新中的Composition API来实现此效果。我写了一个类似问题的答案here

+0

这不是一个答案。您应该将此作为对问题的评论或写出完整的答案 – Liero