WPF磨掉顶部图像,露出下面的图像

WPF磨掉顶部图像,露出下面的图像,wpf,bitmap,transparency,Wpf,Bitmap,Transparency,正如标题所示,使用WPF我希望有一个场景,其中我有一个位图图像,另一个位图覆盖在它上面,并使用鼠标在顶部位图上“绘制”,以便它显示下面的位图。这就像用透明画笔画画一样简单吗?我试过了,但没用,但可能我遗漏了什么。您可以使用可视化画笔创建不透明画框。下面是一个深绿色矩形被浅绿色矩形替换的代码示例。使用这种方法,两个矩形可以是任何元素,包括图像 <Grid MouseMove="Grid_MouseMove"> <Rectangle Fill="DarkGreen"/>

正如标题所示,使用WPF我希望有一个场景,其中我有一个位图图像,另一个位图覆盖在它上面,并使用鼠标在顶部位图上“绘制”,以便它显示下面的位图。这就像用透明画笔画画一样简单吗?我试过了,但没用,但可能我遗漏了什么。

您可以使用
可视化画笔
创建
不透明画框。下面是一个深绿色矩形被浅绿色矩形替换的代码示例。使用这种方法,两个矩形可以是任何元素,包括图像

<Grid MouseMove="Grid_MouseMove">
    <Rectangle Fill="DarkGreen"/>
    <Rectangle Fill="LightGreen">
        <Rectangle.OpacityMask>
            <VisualBrush Stretch="None" AlignmentX="Left" AlignmentY="Top">
                <VisualBrush.Visual>
                    <Path Name="path" Stroke="Black" StrokeThickness="10"/>
                </VisualBrush.Visual>
            </VisualBrush>
        </Rectangle.OpacityMask>
    </Rectangle>
</Grid>

下面是背后的代码:

private void Grid_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        var point = e.GetPosition(sender as Grid);
        if (lastPoint != nullPoint)
            AddSegment(lastPoint, point);
        lastPoint = point;
    }
    else
    {
        lastPoint = nullPoint;
    }
}

private void AddSegment(Point point1, Point point2)
{
    if (segments.Count == 0 || segments[segments.Count - 1].Point != point1)
        segments.Add(new LineSegment(point1, false));
    segments.Add(new LineSegment(point2, true));
    var figures = new PathFigureCollection();
    figures.Add(new PathFigure(new Point(), segments, false));
    var geometry = new PathGeometry();
    geometry.Figures = figures;
    path.Data = geometry;
}

List<LineSegment> segments = new List<LineSegment>();
private static readonly Point nullPoint = new Point(-1, -1);
Point lastPoint = nullPoint;
private void Grid\u MouseMove(对象发送方,MouseEventArgs e)
{
如果(e.LeftButton==鼠标按钮状态。按下)
{
var点=e.GetPosition(发送器作为网格);
if(lastPoint!=nullPoint)
添加段(最后一点,点);
最后一点=点;
}
其他的
{
lastPoint=nullPoint;
}
}
私有void AddSegment(点1、点2)
{
如果(segments.Count==0 | | segments[segments.Count-1]。Point!=point1)
添加(新线段(点1,false));
添加(新线段(点2,真));
var figures=新路径figurescollection();
添加(新路径图(新点(),段,假));
var geometry=新路径几何体();
几何。数字=数字;
路径数据=几何体;
}
列表段=新列表();
私有静态只读点nullPoint=新点(-1,-1);
点lastPoint=零点;

这太棒了,正是我想要的。谢谢