调色一张图片

3
我正在尝试给一个System.Windows.Controls.Image着色。该图像包含透明区域,我只想用颜色着色非透明区域。
例如,该图像是黑色/灰色,将其着成红色会产生红色渐变,透明区域不受影响。
在WPF中是否可以对图像进行染色,无论是在XAML中还是在代码后台中(最好是)?
谢谢 <Image Name="OverlayImage" Canvas.ZIndex="2" /> 示例图像:

enter image description here


1
最简单的方法是使用一个适合于图像的“矩形”,填充您想要的颜色,并且不透明度大约为0.5。否则,您需要使用自定义WPF效果或直接编辑像素数据。 - Abion47
有趣。问题在于这些是全屏图像,并且是用户贡献的。这意味着我事先不知道非透明区域的高度/宽度将是多少。基本上排除了矩形选项 :/ - PersuitOfPerfection
不一定。当图像被提供时,您可以在代码后面进行一些数学计算,以确定图像将呈现的位置。实际上,还有第三种选项可以使用图像本身作为“Rectangle”的“OpacityMask”的源。详情请参见此处 - Abion47
不行,因为如果图像被设置为矩形的OpacityMask(透明度蒙版),透明区域仍然会是透明的。这就是透明度蒙版的作用。 - Abion47
好的,我明白了。那我会试一下的,然后再回报结果。谢谢。 - PersuitOfPerfection
显示剩余2条评论
2个回答

17

正如这篇回答所描述的那样,您可以使用Rectangle进行着色。将矩形的OpacityMask源设置为与图像本身相同,就可以确保透明的部分保持透明。

<Image
    Source="{Binding MyImage}"
    Width="150"
    Height="150" />
<Rectangle Width="150" Height="150">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding Color}"/>
    </Rectangle.Fill>
    <Rectangle.OpacityMask>
        <ImageBrush ImageSource="{Binding MyImage}"/>
    </Rectangle.OpacityMask>
</Rectangle>

再次感谢您的帮助! - PersuitOfPerfection
如何在程序中编程更改“ImageBrush”? - Starwave
这个答案并没有给图像上色,因为较亮和较暗的区域可能(或者很可能)具有相同的不透明度。我选择了GDI。 - DAG

0

一个简单的覆盖层无法满足您的需求。

我之前问过一个类似的问题。共识是您可以使用像素着色器来实现这一点。我的问题的答案提供了几个选项。


3
所有 OP 做的就是将所有不透明的像素着色为一种颜色。他并不关心保持饱和度或亮度等任何复杂的混合选项,因此使用像素着色器的复杂混合选项会显得有些过头。 - Abion47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接