【发布时间】:2015-02-01 23:15:29
【问题描述】:
如何在 WPF(使用 MVVM)中对图像进行着色/着色而不牺牲性能?一个纯粹的 XAML 解决方案将是理想的,因为在代码中修改位图会导致性能损失,因为图像会发生很多变化。图像不仅由简单的形状组成,因此无法使用路径。
【问题讨论】:
标签: c# wpf xaml image-manipulation
如何在 WPF(使用 MVVM)中对图像进行着色/着色而不牺牲性能?一个纯粹的 XAML 解决方案将是理想的,因为在代码中修改位图会导致性能损失,因为图像会发生很多变化。图像不仅由简单的形状组成,因此无法使用路径。
【问题讨论】:
标签: c# wpf xaml image-manipulation
与 WinForms/GDI+ 不同,WPF 似乎不包含任何简单的方法来在呈现图像时对其进行着色/着色。实现这一点的两个想法是,使用着色器,或在图像上覆盖一个彩色矩形。
我决定尝试矩形路线,发现它有效。基本上,您需要做的就是在图像上覆盖一个彩色矩形,并使用OpacityMask 将颜色填充限制在某个区域。 OpacityMask 主要用于路径,但它可以使用任何类型的画笔,包括ImageBrush。这意味着您可以将图像用作彩色填充的“模板”。
示例:(取自我的应用程序,用户可以“突出显示”地图的一部分,实际图像看起来像 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。
【讨论】:
<Rectangle.Fill><SolidColorBrush Color="{Binding Color}"/></Rectangle.Fill>)来保存 ColorToBrushConverter。