如何在WPF中渲染彩色单色位图?

时间:2011-02-27 19:13:14

标签: wpf bitmap render bitmapimage monochrome

回到Win32天,如果我有一个单色位图,这只是一个位图掩码,我可以将该位图渲染到DeviceContext上。会发生的是每个像素,其中有一个'0'它呈现为透明,而每个像素都有一个'1',它在当前选择的前景中呈现。这非常方便。

然而,经过几周的搜索,我在WPF中没有看到任何类似的内容。

现在我要打开我自己的MonochromeBitmapImage类,但是如果有人知道另一种方法可以做到这一点,那就是你们所有人,S.O。用户,所以我的问题是......在WPF中,如何渲染单色位图,其中一个值是特定颜色而另一个值是透明的?

2 个答案:

答案 0 :(得分:4)

OpacityMask的一个非常类似的功能是UIElement。它将显示OpacityMask中不透明的部分。它可以与

一起使用
  • 画笔 - SolidColorBrush
  • 视觉效果 - VisualBrush
  • 图片 - ImageBrush

以下是Button使用ImageBrush

的示例
<Button Content="Opacity Mask">
    <Button.OpacityMask>
        <ImageBrush ImageSource="C:\OpacityRect.png"/>
    </Button.OpacityMask>
</Button>

enter image description here

答案 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对于这种事情来说有点过分,但是对于更复杂的操作它们很有用。