組合效果

Microsoft.UI.Composition API 允許即時效果套用於具有可動畫效果屬性的影像與使用者介面。 在這份概述中,我們將介紹如何在 WinUI 和 Windows 應用程式 SDK 應用程式中,為合成視覺化套用效果的功能。

為了支援 WinUI 與 Windows 應用程式 SDK 應用程式中的一致效果製作,合成效果利用 Win2D 的 IGraphicsEffect 介面,讓你能使用 Microsoft.Graphics.Canvas.Effects 命名空間來描述效果。

筆刷效果是透過對一組現有影像套用效果來繪製應用程式區域。 Windows 應用程式 SDK 中的組成效果 API 專注於 SpriteVisuals。 SpriteVisual 在結合色彩、影像和特效時提供彈性。 視覺化定義矩形的邊界,畫筆定義用於繪製矩形的像素。

效果筆刷用於合成樹中的視覺元素,其內容來自效果圖的輸出。 效果可以參考現有的表面或材質,但不能參考其他合成樹的輸出。

效果也可以透過使用 XamlCompositionBrushBase 的效果筆刷套用到 XAML UIElements 上。

效果特徵

效果函式庫

目前合成支援以下效果:

影響 說明
二維仿射轉換 對影像套用二維仿射轉換矩陣。
算術合數 使用彈性方程式結合兩張影像。
混合效應 會產生混合效果,將兩張圖片結合起來。 Composition 提供了 Win2D 支援的 26 種 混合模式 中的 21 種。
色彩來源 產生包含純色的影像。
複合材料 結合兩張圖片。 Composition 提供 Win2D 支援的所有 13 種複合模式 。
對比 可以增加或減少影像的對比度。
暴露 增加或減少影像的曝光。
灰階 將影像轉換為單色灰色。
伽瑪轉移 透過應用每通道的伽瑪傳遞函數來改變影像的顏色。
色相旋轉 透過旋轉影像的色調值來改變其顏色。
反轉 將影像的顏色反轉。
飽和 改變影像的飽和度。
棕褐色 將影像轉換成棕褐色調。
溫度與色調 調整影像的溫度和/或色調。

欲了解更多詳細資訊,請參閱 Win2D 的 Microsoft.Graphics.Canvas.Effects 命名空間。 未被合成支援的效果標示為[NoComposition]。

連鎖效應

效果可以串接,讓應用程式能同時對一張影像使用多種效果。 效果圖可以支援多個效果,並且這些效果可以互相參照。 描述你的效果時,只要把一個效果作為輸入就行了。

IGraphicsEffect graphicsEffect =
new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect
{
  Source1 = new CompositionEffectSourceParameter("source1"),
  Source2 = new SaturationEffect
  {
    Saturation = 0,
    Source = new CompositionEffectSourceParameter("source2")
  },
  MultiplyAmount = 0,
  Source1Amount = 0.5f,
  Source2Amount = 0.5f,
  Offset = 0
};

上述範例描述了一個具有兩個輸入的算術複合效應。 第二個輸入則有飽和效果,飽和度約為 0.5。

動畫支援

效果屬性支援動畫,在編譯效果期間,你可以指定哪些效果屬性可以被動畫化,以及哪些可以作為常數被「預先嵌入」。 可動畫屬性透過「效果名稱.屬性名稱」這樣的字串來指定。 這些屬性可以在多次實例中獨立地動畫化。

恆定效果與動畫效果屬性

在效果編譯過程中,你可以指定效果屬性為動態屬性,或是以常數形式「內建」的屬性。 動態屬性透過「<效果名稱>.<屬性名稱>」來指定。 動態屬性可以設定為特定值,或使用合成動畫系統來進行動畫化。

在編譯上述效果描述時,您可以選擇將飽和度固定設為 0.5,也可以設定為動態變化,或透過動畫進行設定。

在內建飽和效果的情況下編譯效果:

var effectFactory = _compositor.CreateEffectFactory(graphicsEffect);

編譯具有動態飽和特性的特效:

var effectFactory = _compositor.CreateEffectFactory(graphicsEffect, new[]{"SaturationEffect.Saturation"});
_catEffect = effectFactory.CreateBrush();
_catEffect.SetSourceParameter("mySource", surfaceBrush);
_catEffect.Properties.InsertScalar("saturationEffect.Saturation", 0f);

上述效果的飽和特性可以設定為靜態值,或使用 Expression 或 ScalarKeyFrame 動畫來動畫化。

你可以建立一個 ScalarKeyFrame,用來動畫化像這樣的效果的飽和屬性:

ScalarKeyFrameAnimation effectAnimation = _compositor.CreateScalarKeyFrameAnimation();
            effectAnimation.InsertKeyFrame(0f, 0f);
            effectAnimation.InsertKeyFrame(0.50f, 1f);
            effectAnimation.InsertKeyFrame(1.0f, 0f);
            effectAnimation.Duration = TimeSpan.FromMilliseconds(2500);
            effectAnimation.IterationBehavior = AnimationIterationBehavior.Forever;

從效果的飽和屬性開始動畫,就像這樣:

catEffect.Properties.StartAnimation("saturationEffect.Saturation", effectAnimation);

具有獨立屬性的多重效果實例

透過在效果編譯過程中指定參數為動態,該參數即可依每個效應實例進行變更。 這讓兩個視覺效果都能使用相同效果,但呈現出不同的效果屬性。

入門構圖效果

這個快速入門教學教你如何運用效果的一些基本功能。

安裝 Visual Studio

  • 如果你沒有安裝支援的 Visual Studio 版本,請前往 這裡的 Visual Studio 下載頁面。

創建新專案

  • 移至 [ 檔案>新>專案]。
  • 選擇 WinUI 空白應用程式(封裝) 範本。
  • 輸入你選擇的專案名稱。
  • 點擊 建立。

安裝 Win2D

Win2D 是以 NuGet.org 套件形式釋出,必須先安裝才能在 WinUI 專案中使用這些效果。

  • 啟動 NuGet 套件管理器時,請前往工具的>NuGet 套件管理器>,管理NuGet 套件以獲取解決方案。
  • 搜尋 Win2D.WinUI ,並安裝該套件給你的專案。
  • 接受授權合約。
  • 按下 關閉。

接下來的幾步,我們將使用合成 API 對這張貓影像套用飽和效果,去除所有飽和度。 在此模型中,該效果先被創造並套用到影像上。

原始圖片

設定你的作文基礎

_compositor = ElementCompositionPreview.GetElementVisual(MyHost).Compositor;
_root = _compositor.CreateContainerVisual();
ElementCompositionPreview.SetElementChildVisual(MyHost, _root);

建立合成表面畫筆

CompositionSurfaceBrush surfaceBrush = _compositor.CreateSurfaceBrush();
LoadedImageSurface imageSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/cat.png"));
surfaceBrush.Surface = imageSurface;

建立、編譯與套用效果

  1. 創造圖形效果。

    var graphicsEffect = new SaturationEffect
    {
        Saturation = 0.0f,
        Source = new CompositionEffectSourceParameter("mySource")
    };
    
  2. 編譯效果並建立效果筆刷。

    var effectFactory = _compositor.CreateEffectFactory(graphicsEffect);
    
    var catEffect = effectFactory.CreateBrush();
    catEffect.SetSourceParameter("mySource", surfaceBrush);
    
  3. 在合成樹中建立 SpriteVisual 並套用效果。

    var catVisual = _compositor.CreateSpriteVisual();
    catVisual.Brush = catEffect;
    catVisual.Size = new Vector2(219, 300);
    _root.Children.InsertAtBottom(catVisual);
    
  4. 執行您的應用程式。 你的結果應該是一隻去飽和的貓:

去飽和影像

其他資訊