WPF擦掉顶部图像以显示下面的图像

时间:2011-01-23 14:30:31

标签: wpf bitmap transparency

正如标题所示,使用WPF我希望有一个场景,我有一个位图图像,另一个位图叠加在它上面,并使用鼠标“绘制”在顶部位图上,以便它显示下面的位图。这是否就像用透明刷子绘画一样简单?我试过这个没有用,但也许我错过了什么。

1 个答案:

答案 0 :(得分:2)

您可以使用VisualBrush创建OpacityMask。这是一个深绿色矩形的代码示例,由浅绿色矩形代替。使用这种方法,两个矩形可以是任何元素,包括图像。

<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;