C# 两个图像层和不透明掩码
我试图从一个图像中裁剪出一个圆,然后将它放在WPF中的另一个图像上 圆的中心会根据鼠标的移动而变化,需要动态地限定 我试图将两个图像放置在彼此的顶部,并使用我实时绘制的第三个图像作为不透明度遮罩 你能提供简短的代码来有效地解决这个问题吗C# 两个图像层和不透明掩码,c#,wpf,image,xaml,opacitymask,C#,Wpf,Image,Xaml,Opacitymask,我试图从一个图像中裁剪出一个圆,然后将它放在WPF中的另一个图像上 圆的中心会根据鼠标的移动而变化,需要动态地限定 我试图将两个图像放置在彼此的顶部,并使用我实时绘制的第三个图像作为不透明度遮罩 你能提供简短的代码来有效地解决这个问题吗 下面的代码描述了如何使用不透明掩码。这有点违反直觉,因为我们希望XAML渲染将元素从下到上分层 但是,在这种情况下,您希望“背景”图像层叠在前景之上,因为不透明贴图将仅用于显示由VisualBrush的位置和大小描述的前景部分,从而使其余部分透明。具体如下: &
下面的代码描述了如何使用
不透明掩码
。这有点违反直觉,因为我们希望XAML渲染将元素从下到上分层
但是,在这种情况下,您希望“背景”图像层叠在前景之上,因为不透明贴图将仅用于显示由VisualBrush的位置和大小描述的前景部分,从而使其余部分透明。具体如下:
<Grid x:Name="MainGrid" MouseMove="Grid_MouseMove">
<Rectangle Fill="Red" ></Rectangle>
<Rectangle Fill="Green">
<Rectangle.OpacityMask>
<VisualBrush Stretch="None" >
<VisualBrush.Visual>
<Ellipse Width="40" Height="40" StrokeThickness="1" Fill="Black" />
</VisualBrush.Visual>
<VisualBrush.RelativeTransform>
<TransformGroup>
<TranslateTransform x:Name="OpacityFilterTransform" X="1" Y="1"/>
</TransformGroup>
</VisualBrush.RelativeTransform>
</VisualBrush>
</Rectangle.OpacityMask>
</Rectangle>
</Grid>
此解决方案应适用于您想要分层的
Visual
的任何后代 它只是几个SolidBrush对象,还是比这更复杂?
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
var position = e.GetPosition(this);
var height = MainGrid.ActualHeight;
var width = MainGrid.ActualWidth;
// with the position values, interpolate a TranslateTransform for the opacity mask
var transX = position.X / width;
var transY = position.Y / height;
OpacityFilterTransform.X = transX - 0.5;
OpacityFilterTransform.Y = transY - 0.5;
}