Wpf 带有BitmapImage的DrawingContext.PushOpacityMask()不起作用

Wpf 带有BitmapImage的DrawingContext.PushOpacityMask()不起作用,wpf,wpf-4.0,opacitymask,wpf-4.5,system.windows.media,Wpf,Wpf 4.0,Opacitymask,Wpf 4.5,System.windows.media,我想获取给定的位图图像,并将其灰度/黑白表示用作DrawingContext上的不透明度遮罩 我做了足够多的颜色转换,所以我最终得到了演示应用程序的以下状态: ViewModel上的方法: public void Demo() { var width = 400; var height = 400; var target = new RenderTargetBitmap(width, height, 96, 96, PixelFormat

我想获取给定的位图图像,并将其灰度/黑白表示用作DrawingContext上的不透明度遮罩

我做了足够多的颜色转换,所以我最终得到了演示应用程序的以下状态:

ViewModel上的方法:

public void Demo()
    {
        var width = 400;
        var height = 400;

        var target = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        var target2 = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);

        var drawingVisual = new DrawingVisual();
        var drawingVisual2 = new DrawingVisual();

        using (var drawingContext = drawingVisual.RenderOpen())
        {
            var bitmapImage = new BitmapImage(new Uri(@"pack://application:,,,/WarningFilled.png"));

            using (var drawingContext2 = drawingVisual2.RenderOpen())
            {
                drawingContext2.DrawImage(bitmapImage, new Rect(0, 0, width, height));
            }

            target2.Render(drawingVisual2);

            var mask = target2.ToGrayscale();
            this.Mask = mask;

            drawingContext.PushOpacityMask(new ImageBrush(mask));
            drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, width, height));
            // drawingContext.Pop();
        }

        target.Render(drawingVisual);

        this.Rendered = target;
    }
视图:


运行演示应用程序会产生以下结果:

我希望左侧的红色矩形反映在绘制实际矩形之前推到DrawingContext上的不透明度遮罩

您在右侧看到的图像是颜色转换后的位图图像,就在它作为不透明度遮罩推送之前。正如我之前提到的,我也尝试过黑白转换,但即使只有两种颜色也没有效果

我尝试过许多类似的设置和场景,但我没有让不透明遮罩工作。

来自MSDN(我的重点)文章:

要创建不透明度遮罩,请将笔刷应用于不透明度遮罩 元素或可视对象的属性。笔刷将映射到元素 或视觉,每个笔刷像素的不透明度值用于 确定图像中每个对应像素的结果不透明度 元素或视觉

将忽略像素的颜色值

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wpfApplication1="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <wpfApplication1:MainViewModel></wpfApplication1:MainViewModel>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" BorderThickness="2" BorderBrush="Blue" HorizontalAlignment="Center">
        <Image Source="{Binding Rendered}" Width="400" Height="400"></Image>
    </Border>
    <Border Grid.Column="1" BorderThickness="2" BorderBrush="Green" HorizontalAlignment="Center">
        <Image Source="{Binding Mask}" Width="400" Height="400"></Image>
    </Border>
</Grid>