如何在不牺牲性能的情况下在WPF中对图像进行着色(使用MVVM)?纯XAML解决方案是理想的,因为在代码中修改位图会导致大量更改图像的性能损失。图像由多个简单的形状组成,因此无法使用路径。
qvsjd97n1#
与WinForms/GDI+不同,WPF似乎不包含任何简单的方法来着色/着色图像,因为它正在呈现。实现这一点的两个想法是,使用着色器,或在图像上覆盖一个彩色矩形。我决定尝试矩形路线,发现它的工作。基本上,您需要做的就是在图像上覆盖一个彩色矩形,并使用OpacityMask将颜色填充限制在特定区域。OpacityMask主要用于路径,但它可以采用任何类型的画笔,包括ImageBrush。这意味着您可以使用您的图像作为“模具”的彩色填充。
OpacityMask
ImageBrush
示例:(取自我的应用程序,其中用户可以“突出显示”Map的一部分,实际图像看起来像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。
1条答案
按热度按时间qvsjd97n1#
与WinForms/GDI+不同,WPF似乎不包含任何简单的方法来着色/着色图像,因为它正在呈现。实现这一点的两个想法是,使用着色器,或在图像上覆盖一个彩色矩形。
我决定尝试矩形路线,发现它的工作。基本上,您需要做的就是在图像上覆盖一个彩色矩形,并使用
OpacityMask
将颜色填充限制在特定区域。OpacityMask主要用于路径,但它可以采用任何类型的画笔,包括ImageBrush
。这意味着您可以使用您的图像作为“模具”的彩色填充。示例:(取自我的应用程序,其中用户可以“突出显示”Map的一部分,实际图像看起来像this)
以下是所有需要的XAML:
要像我一样将颜色绑定到画笔,请使用ColorToBrushConverter。