【问题标题】:Change Alpha Blend Mode in WPF?在 WPF 中更改 Alpha 混合模式?
【发布时间】:2011-02-06 17:46:14
【问题描述】:

System.Drawing.Graphics 类有一个带有两个选项的 CompositionMode 属性:SourceOver(它基于 alpha 组件,将绘制的任何内容与现有的背景混合)或 SourceCopy,它只是用正在绘制的任何内容覆盖背景.

WPF 中是否存在类似的东西?

在 WPF 中,当我在另一个之上绘制一条折线时,新的折线总是与背景混合。我认为这与正在使用的容器无关。我正在使用画布,但在任何地方都找不到混合模式属性。我要做的就是上面提到的SourceCopy compositionmode 所做的。 IE。新的折线应该简单地覆盖画布上已有的内容。

有没有一种简单的方法可以做到这一点,而不是使用像素着色器(据我所知,这无论如何都行不通,因为我无法访问 Canvas 后台缓冲区)。

我不拘泥于 Canvas,并且很乐意使用任何支持覆盖模式的容器。

我目前有一个基于 WriteableBitmap 的解决方案,我为其获取 System.Drawing.Graphics 上下文,然后操作 CompositionMode。它可以工作,但由于我的窗口是全屏的,因此该解决方案会对性能产生严重影响。

说明和示例: WPF 窗口是完全透明的,画布也是如此(背景颜色(0,0,0,0))。现在我用 Color.FromArgb(128,128,0,0) 绘制一条折线。我现在有一条半透明的红色折线。接下来,我使用 Color.FromArgb(0,0,0,0) 绘制相同的折线。由于发生了 alpha 混合,结果与以前相同。然而,我想要的是用第二条折线擦除红色折线(这正是 Graphics 类中的 SourceCopy 模式所做的。

【问题讨论】:

    标签: wpf alphablending


    【解决方案1】:

    我认为您需要做的就是确保用于填充/描边PolyLine 的画笔具有完全不透明的 alpha 值(即255)。那么背景不应该混入其中。

    【讨论】:

    • 是的,但我需要用任何 alpha 值覆盖背景,甚至是 0。请参阅我刚刚添加到问题中的说明和示例。
    【解决方案2】:

    您可以应用剪贴蒙版,这样您就可以提供剪切其下方元素的路径,但在需要剪切大量元素后可能很难维护...

    【讨论】:

    • 在我当前使用 WritableBitmap 的解决方案中,我确实应用了一个剪切矩形(通过 AddDirtyRect)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多