在Win32时代,如果我有一个单色位图,出于所有目的和目的,它只是一个位图蒙版,则可以将该位图渲染到DeviceContext上。将会发生的情况是,在当前选定的原色中,将其呈现为“ 0”的每个像素都呈现为透明,而将其呈现为“ 1”的每个像素。这非常方便。
但是,经过几周的搜索,我没有在WPF中看到任何类似的东西。
现在,我将只滚动自己的MonochromeBitmapImage类,但认为如果有人知道另一种方法,那就是S.O。用户,所以这是我的问题...在WPF中,如何渲染单色位图,其中一个值是特定的颜色,而另一个值是透明的?
最佳答案
这取决于您是否需要使用单色位图,还是只希望能够对图像重新着色。如果可以使用任何图像格式,我可以将png与alpha一起使用,则可以将图像用作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,对于这种事情来说有点过分了,但是对于更复杂的操作,它们很有用。