【发布时间】:2018-02-18 04:38:01
【问题描述】:
最好使用 XAML,
我需要动态地在彩色图像上从下到上应用灰度滤镜。也就是说,我希望能够以编程方式更改应用于我的图像的灰度滤镜的偏移值。
例如,我想以编程方式将图像的 50% 设置为彩色(从图像底部到其中间),而将其他 50% 的图像设置为灰度(例如,从图像的中间图片到顶部)。
我已经阅读了很多不同的答案,尝试了很多不同的事情,并且想了很多不同的方法来做到这一点。
- 我可以有两张图像,一张在另一张上面。一个是灰度的,另一个是彩色的。然后,我将以编程方式更改灰度图像的大小,以便其下方的彩色图像部分显示并为用户创建一种半半视图。
但是,此解决方案提出了一个我似乎无法解决的问题。更改灰度图像的高度值时,由于“拉伸”属性设置为“均匀”(我不希望更改为“无”),图像会自动重新缩放。
另一种方法是通过编程更改图像的颜色像素。过去我在这方面取得了一些成功,但是,这对于我在这里尝试做的事情来说太慢了(理想情况下,我会将图像的颜色从灰度更改为选择的图像的原始颜色用户每 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 中):
myImageLinearGradientBrushStop.Offset = percent * 0.01;
如前所述,我浏览了很多不同的网站,阅读了很多类似的问题,尝试了很多不同的答案,但仍然无法令人满意地解决问题。
【问题讨论】:
-
听起来像是想要做出自己的影响,虽然我不知道你是否可以绑定到它们,或者从图像派生并可能在位图级别添加渐变
-
嗨,Michael,感谢您抽出宝贵时间回答我的问题。在 XAML 中将我自己的灰度效果绑定到我的图像控件确实是我想要实现的。但是,不幸的是,我不确定从哪里开始。如果您有任何想法,请告诉我。
标签: c# wpf image xaml grayscale