在 WPF 中为部分透明图像着色

Tint a partially transparent image in WPF

如何在不牺牲性能的情况下 tint/colorize WPF 中的图像(使用 MVVM)?一个纯粹的 XAML 解决方案将是理想的,因为在代码中修改位图会导致性能损失,并导致大量变化的图像。图片由多个简单的形状组成,因此无法使用路径。

与 WinForms/GDI+ 不同,WPF 似乎不包含任何在呈现图像时 colorize/tint 图像的简单方法。实现这一点的两个想法是,使用着色器,或在图像上覆盖一个彩色矩形。

我决定试试矩形路线,发现它很管用。基本上,您需要做的就是在图像上覆盖一个彩色矩形,并使用 OpacityMask 将颜色填充限制在特定区域。 OpacityMask 主要用于路径,但它可以采用任何类型的画笔,包括 ImageBrush。这意味着您可以将图像用作彩色填充的 "stencil"。

示例:(取自我的应用程序,其中用户可以 "highlight" 地图的一部分,实际图像看起来像 this

覆盖和遮罩之前

叠加和蒙版后

这里是所有必需的XAML:

<Image
    Source="{Binding MyImage}"
    Width="150"
    Height="150" />
<Rectangle Width="150" Height="150">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding Color}"/>
    </Rectangle.Fill>
    <Rectangle.OpacityMask>
        <ImageBrush ImageSource="{Binding MyImage}"/>
    </Rectangle.OpacityMask>
</Rectangle>

要像我一样将颜色绑定到画笔,请使用 ColorToBrushConverter