最好使用XAML,
我需要动态地将灰度滤镜应用于彩色图像,从底部到顶部。也就是说,我希望能够在程序中更改应用于我的图像的灰度滤镜的偏移值。
例如,我想要以编程方式设置图像的50%为彩色(从图像底部到其中间),并将图像的另外50%设置为灰度(例如,从图像中间到其顶部)。
我已经阅读了很多不同的答案,尝试了很多不同的方法,并考虑了很多不同的方法来解决这个问题。
- 我可以有两个图像,一个位于另一个之上。一个是灰度的,另一个是彩色的。然后我将以编程方式更改灰度图像的大小,以便下面的彩色图像部分显示并为用户创建一种半半的视图。
但是,这种解决方案存在一个我似乎无法解决的问题。当更改灰度图像的高度值时,由于“Stretch”属性设置为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>
在一个重复每50毫秒的timerEventProcessor中的Code-behind代码:
myImageLinearGradientBrushStop.Offset = percent * 0.01;
如之前所提到的,我浏览了许多不同的网站,阅读了很多类似的问题,并尝试了许多不同的答案,仍然无法令人满意地解决这个问题。