c# - 如何在 UWP Composition API 中组合多种效果

标签 c# uwp windows-composition-api

我想结合模糊、饱和度和色调。

我有一个混合效果,由高斯模糊和色调颜色组成。

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

var graphicsEffect = new BlendEffect
{
    Mode = BlendEffectMode.Overlay,
    Background = new GaussianBlurEffect()
    {
        Name = "Blur",
        Source = new CompositionEffectSourceParameter("Backdrop"),
        BlurAmount = 10f
        BorderMode = EffectBorderMode.Hard,
    },
    Foreground = new ColorSourceEffect()
    {
        Name = "Tint",
        Color = Color.FromArgb(120, 255, 255, 255),
    }
};


var effectFactory = _compositor.CreateEffectFactory(graphicsEffect)
_brush = effectFactory.CreateBrush();
_brush.SetSourceParameter("Backdrop", _compositor.CreateBackdropBrush());

_effectSprite = _compositor.CreateSpriteVisual();
_effectSprite.Size = new Vector2((float)this.ActualWidth, (float)this.ActualHeight)
_effectSprite.Brush = _brush;
ElementCompositionPreview.SetElementChildVisual(this, _effectSprite)

如何在此效果之前或之后添加 SaturationEffect?

我尝试将其包装到另一个 BlendEffect 中,并将另一个 BackdropBrush 设置为 SaturationEffect 的源,但我只得到白色背景。

我还尝试从 SaturationEffect 创建画笔并将其设置为 GaussianBlur 源,但出现异常“源画笔无效”

最佳答案

这是一个例子:

(input) Backdrop -> GaussianBlur ->|
                     ColorSource ->| Blend -> Saturation (output)
var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

var blurEffect = new GaussianBlurEffect()
{
    Name = "Blur",
    BlurAmount = 0.0f,
    BorderMode = EffectBorderMode.Hard,
    Optimization = EffectOptimization.Balanced,
    Source = new CompositionEffectSourceParameter("source"),
};

var colorEffect = new ColorSourceEffect
{
    Name = "Tint",
};

var blendEffect = new BlendEffect
{
    Background = blurEffect,
    Foreground = colorEffect,
    Mode = BlendEffectMode.Overlay,
};

var saturationEffect = new SaturationEffect
{
    Name = "Saturation",
    Source = blendEffect,
    Saturation = 1.5f,
};

var factory = compositor.CreateEffectFactory(saturationEffect, new[]
{
    "Blur.BlurAmount",
    "Tint.Color",
    "Saturation.Saturation",
});

var brush = factory.CreateBrush();
brush.SetSourceParameter("source", compositor.CreateBackdropBrush());

// Animatable properties
brush.Properties.InsertScalar("Blur.BlurAmount", 10);
brush.Properties.InsertColor("Tint.Color", Color.FromArgb(20, 255, 0, 0));
brush.Properties.InsertScalar("Saturation.Saturation", 1.5f);

var sprite = compositor.CreateSpriteVisual();
sprite.Brush = brush;
sprite.Offset = new Vector3(50, 250, 0);
sprite.Size = new Vector2(200, 200);
ElementCompositionPreview.SetElementChildVisual(this, sprite);

Screenshot

关于c# - 如何在 UWP Composition API 中组合多种效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101198/

相关文章:

c# - 在开发计算机上运行 azure web 应用程序时出现数据库访问错误

c# - 需要以相同方式处理的多种方法

c# - 如何在 Windows 通用应用程序中对焦相机?

c# - 如何从后台任务在主应用程序上执行功能

c# - 轻松上色动画

c# - 将字节数组写入Windows Phone中的存储文件

c# - 如何在两个函数之间字符串化一个值?

c# - 集合类型附加属性

c# - 如何在 Windows 10 Creators Update 中使用 Acrylic Accent?