最近我正在学习UWP并尝试构建一个简单的演示,我只想生成一个简单的生活模糊效果,就像Aero。它有时很有用(eg.real时间相机过滤器),所以我想出了这样一个想法:
首先,我导入了CanvasAnimatedControl库,并在RootGrid上放置了一个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画布被严重推迟了。那么,我应该怎么做才能使它具有高性能呢?
发布于 2015-11-09 12:06:29
官方回答是:使用。它有一个BlurEffect,如果用SwapChainPanelRenderer实时渲染的话,它会非常快。我在我的博客文章利用SwapChainPanelRenderer改进Lumia成像SDK 3的实时渲染中写到了这一点,我用BlurEffect作为例子。完整的源代码是可在GitHub上获得。
这可以归结为每当模糊的RenderAsync值更改为新的滑块值时,就调用SwapChainPanelRenderer实例上的KernelSize。
private async void EffectRangeSlider_OnValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (this.renderer != null)
{
this.viewModel.blur.KernelSize = (int)e.NewValue;
await this.renderer.RenderAsync();
}
}https://stackoverflow.com/questions/33590321
复制相似问题