1. 程式人生 > >wpf 實現實時毛玻璃(live blur)效果

wpf 實現實時毛玻璃(live blur)效果

() 參數 顯示 top cli gif etc har led

原文:wpf 實現實時毛玻璃(live blur)效果

I2OS7發布後,就被它的時實模糊吸引了,就想著能不能將這個效果引入到我們的產品上。拿來當mask肯定會很爽,其實在之前也做過類似的,但是不是實時效果,是死的,只是截圖然後模糊,當背景,效果可想而知。


然後就想著自己做實時濾鏡, ? 自己寫了高斯模糊算法,模糊效果還算可以,但是背景取樣效率太低,也試過優化這個過程。試過:將截圖縮小,再模糊,再放大,模糊時先橫向再縱向,最終效果還是不理想。

最後 發現WPF裏的自VisualBrush就可以輕松完成這個效果。 技術分享圖片


首先來一張最終運行的效果圖:

技術分享圖片


這裏為了確定它真的是實時的,我將兩個圖片放在ScrollViewer裏面。以便可以拖動預覽效果。這裏的模糊半徑是80


主要思路是,在BlurMask裏面添加一個Border,這個Border的背景就是實時模糊效果。

模糊層我是自定義了一個BlurMask控件,該控件繼承Grid,以便在上面添加內容,也方便在沒有被BlurMask覆蓋的時候將模糊效果切斷(下面那個小的模糊區域)。

BlurMask中最主要的代碼:其中targetpanel就是需要覆蓋的那個控件


Border border=new Border();
VisualBrush brush = new VisualBrush();
brush.Visual = targetPanel;
brush.Stretch = Stretch.Uniform;
border.Background = brush;
border.Effect = new BlurEffect()
	{
		Radius = 80,
		RenderingBias = RenderingBias.Performance
	}
border.Margin = new Thickness(-this.Margin.Left, -this.Margin.Top, 0, 0);



這樣我們就能實時的將targetpanel模糊,並顯示到Border的背景上。接下來需要做的就是將border添加到Grid中


this.ClipToBounds = true;
this.Children.Clear();
this.Children.Add(border);


主要代碼就這麽一些,然後我們要做的是暴露需要設置的參數 模糊半徑和遮罩目標。



源碼下載


wpf 實現實時毛玻璃(live blur)效果