在 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。
如何在不牺牲性能的情况下 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。