wpf 實現實時毛玻璃(live blur)效果
阿新 • • 發佈:2018-09-26
() 參數 顯示 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)效果