使用XAML将彩色图像转换为灰度图像?

时间:2018-02-18 04:38:02

标签: c# wpf image xaml grayscale

最好使用XAML,

我需要动态地从底部到顶部对彩色图像应用灰度滤镜。这就是说,我希望能够以编程方式更改应用于我的图像的灰度滤镜的偏移值。

例如,我想以编程方式设置50%的图像颜色(从图像的底部到中间),另外50%的图像是灰度的(例如从中间的图像到顶部)。

我已经阅读了很多不同的答案,尝试了很多不同的事情,并考虑了很多不同的方法来做到这一点。

  • 我可以有两个图像,一个在另一个上面。一个是灰度级,另一个是彩色的。然后,我将以编程方式更改灰度图像的大小,以便它下面的颜色图像将部分显示并为用户创建一种半视图。

然而,这个解决方案提出了一个我似乎无法解决的问题。当改变灰度图像的高度值时,由于“拉伸”图像,图像会自动重新缩放。属性设置为Uniform(并且我不希望更改为None)。

  • 另一种方法是以编程方式更改图像的颜色像素。我在过去已经取得了一些成功,但是,这对于我在这里要做的事情来说太慢了(理想情况下,我会将图像的颜色从灰度改变为所选图像的原始颜色)用户每50毫秒直到达到一定高度。)

  • 第三种方法可以是在图像上应用不透明蒙版,并使用LinearGradientBrush将偏移值更改为所需位置。这是我目前正在使用的代码,它可以工作,但只是将灰色应用于图像而不将图像的原始颜色更改为灰度(导致一种褪色的彩色图像):

    < / LI>

XAML:

<Image x:Name="myImage" HorizontalAlignment="Left" VerticalAlignment="Top" Source="C:\Users\Clement\Desktop\test.png" Canvas.Left="159" Canvas.Top="81" Width="500" Height="375" >
            <Image.OpacityMask>
                <LinearGradientBrush EndPoint="0.5,0" MappingMode="RelativeToBoundingBox" StartPoint="0.5,1">
                    <GradientStop x:Name="myImageLinearGradientBrushStop" Color="Black"/>
                    <GradientStop Color="Transparent" Offset="1"/>
                </LinearGradientBrush>
            </Image.OpacityMask>
</Image>

代码隐藏(在每50ms重复一次的timerEventProcessor中):

myImageLinearGradientBrushStop.Offset = percent * 0.01;

如前所述,我浏览了很多不同的网站,阅读了很多类似的问题并尝试了很多不同的答案,仍然无法圆满解决问题。

2 个答案:

答案 0 :(得分:3)

下面的XAML使用两行网格来显示两个图像。顶部图像的宽度和高度绑定到底部图像的大小,该图像跨越两个网格行。内部网格用于剪切顶部图像。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Image x:Name="image" Grid.RowSpan="2" Source="..."/>

    <Grid>
        <Image Width="{Binding ActualWidth, ElementName=image}"
               Height="{Binding ActualHeight, ElementName=image}"
               HorizontalAlignment="Center" VerticalAlignment="Top">
            <Image.Source>
                <FormatConvertedBitmap Source="{Binding Source, ElementName=image}"
                                       DestinationFormat="Gray8"/>
            </Image.Source>
        </Image>
    </Grid>
</Grid>

答案 1 :(得分:1)

感谢Clemens&#39;帮助,我能够解决我的问题!

这是可能感兴趣的人的最终XAML代码:

String(describing:)

在这里,我只是将OpacityMask添加到Gray8图像中以恢复其透明度。

快乐的编码!