回到Win32天,如果我有一个单色位图,这只是一个位图掩码,我可以将该位图渲染到DeviceContext上。会发生的是每个像素,其中有一个'0'它呈现为透明,而每个像素都有一个'1',它在当前选择的前景中呈现。这非常方便。
然而,经过几周的搜索,我在WPF中没有看到任何类似的内容。
现在我要打开我自己的MonochromeBitmapImage类,但是如果有人知道另一种方法可以做到这一点,那就是你们所有人,S.O。用户,所以我的问题是......在WPF中,如何渲染单色位图,其中一个值是特定颜色而另一个值是透明的?
答案 0 :(得分:4)
OpacityMask
的一个非常类似的功能是UIElement
。它将显示OpacityMask中不透明的部分。它可以与
SolidColorBrush
等VisualBrush
ImageBrush
以下是Button
使用ImageBrush
<Button Content="Opacity Mask">
<Button.OpacityMask>
<ImageBrush ImageSource="C:\OpacityRect.png"/>
</Button.OpacityMask>
</Button>
答案 1 :(得分:2)
这取决于您是否需要使用单色位图,或者您只是希望能够重新着色图像。如果您可以使用任何图像格式,我会使用带有alpha的png,那么您可以将图像用作OpacityMask,无需代码。通过将图像用作OpacityMask,您可以轻松更改颜色,使用渐变或ImageBrush。
<Rectangle Fill="Blue">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="..." />
</Rectangle.OpacityMask>
</Rectangle>
如果需要使用1位位图,将它们转换为带有自定义调色板的索引格式非常简单。您可以在调色板中设置所需的颜色,或者只选择任何颜色并将其用作OpacityMask。 FormatConvertedBitmap似乎需要一个不同的格式,只是一个不同的调色板没有效果。
public static FormatConvertedBitmap Recolor(BitmapImage b, Color c)
{
return new FormatConvertedBitmap(b, PixelFormats.Indexed2, new BitmapPalette(new List<Color>() { Colors.Transparent, c }), 0);
}
另一种选择是PixelShader对于这种事情来说有点过分,但是对于更复杂的操作它们很有用。