2

回到 Win32 时代,如果我有一个单色位图,它只是一个位图掩码,我可以将该位图渲染到 DeviceContext 上。会发生的情况是每个像素呈现为透明的“0”,以及呈现为“1”的每个像素以当前选定的前景色呈现。这非常方便。

但是,经过几周的搜索,我在 WPF 中没有看到任何类似的东西。

现在我正要推出我自己的 MonochromeBitmapImage 类,但我想如果有人知道另一种方法来做到这一点,那就是你们所有人,SO 用户,所以我的问题是......如何在 WPF 中渲染一个单色位图,一个值是特定颜色,另一个值是透明的?

4

2 回答 2

4

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

  • 刷子SolidColorBrush
  • 视觉效果 -VisualBrush
  • 图片 -ImageBrush
  • ETC

这是一个使用 a 的Button示例ImageBrush

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

在此处输入图像描述

于 2011-02-28T00:11:49.537 回答
3

这取决于您是否需要使用单色位图,或者您只是希望能够重新着色图像。如果您可以使用任何图像格式,我会使用带有 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,这对于这种事情来说有点矫枉过正,但对于更复杂的操作它们很有用。

于 2011-02-28T00:05:55.657 回答