最好使用XAML,
我需要动态地从底部到顶部对彩色图像应用灰度滤镜。这就是说,我希望能够以编程方式更改应用于我的图像的灰度滤镜的偏移值。
例如,我想以编程方式设置50%的图像颜色(从图像的底部到中间),另外50%的图像是灰度的(例如从中间的图像到顶部)。
我已经阅读了很多不同的答案,尝试了很多不同的事情,并考虑了很多不同的方法来做到这一点。
然而,这个解决方案提出了一个我似乎无法解决的问题。当改变灰度图像的高度值时,由于“拉伸”图像,图像会自动重新缩放。属性设置为Uniform(并且我不希望更改为None)。
另一种方法是以编程方式更改图像的颜色像素。我在过去已经取得了一些成功,但是,这对于我在这里要做的事情来说太慢了(理想情况下,我会将图像的颜色从灰度改变为所选图像的原始颜色)用户每50毫秒直到达到一定高度。)
第三种方法可以是在图像上应用不透明蒙版,并使用LinearGradientBrush
将偏移值更改为所需位置。这是我目前正在使用的代码,它可以工作,但只是将灰色应用于图像而不将图像的原始颜色更改为灰度(导致一种褪色的彩色图像):
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;
如前所述,我浏览了很多不同的网站,阅读了很多类似的问题并尝试了很多不同的答案,仍然无法圆满解决问题。
答案 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图像中以恢复其透明度。
快乐的编码!