WPF,C#:在图像控件中的现有位图上画一条线

时间:2011-03-08 10:18:23

标签: wpf bitmap drawing

我在图像控件中有一个位图图像

                             

每次我用鼠标点击它,在我点击鼠标的地方,我需要在位图上画一条红线。

我首先想到创建一个Line对象,但发现,我无法添加Line。我需要一块帆布。但是如果我将我的图像放在画布上,我的位图就不会覆盖整个画布(我发现,位图的坐标确定了画布上的位置,所以我的位图显示错误。)

然后我尝试使用图形

Graphics graphics = Graphics.FromImage(bitmapImg);
graphics.DrawLine(new System.Drawing.Pen(System.Drawing.Color.Red), 0, 0,  bitmapImg.Width, bitmapImg.Height); //not the line yet, just for testing
    graphics.DrawImage(bitmapImg, 0, 0, bitmapImg.Width,bitmapImg.Height);
        graphics.Dispose();

但是,我没有在我的位图上画任何东西........

现在我想,我可能必须将位图放入数组中,然后更改像素颜色以获取位图中的线条。我相信,这会很慢。

我现在正在尝试使用visualDrawing,但是,我还没有让它工作: - (

在WPF C#中获取现有位图的一个好方法是什么?以及如何删除它?

我很乐意提供任何帮助!谢谢!我已经在MS论坛页面上发布了它,但到目前为止还没有答案。

2 个答案:

答案 0 :(得分:4)

执行Graphics.FromImage时,此Graphics类(以及System.Drawing.Pen)不属于WPF,它们是WinForms的一部分,它们在内部使用Windows的GDI +调用绘制并无法在WPF上绘制。

如果编译代码的第一行时没有出错,那么bitmapImg可能是System.Drawing.Image(来自WinForms)而不是来自WPF的图像控件({{1} })。

正如adrianm所说,最简单的方法可能是使用网格:

System.Window.Controls.Image

然后,在您的点击事件处理程序中,您可以使该行可见并为其指定所需的坐标:

<Grid>
    <Image Source="your image" />
    <Line Name="line" Visibility="Hidden" Stroke="Red" StrokeThickness="1" />
</Grid>

答案 1 :(得分:0)

您可以将背景透明的画布放在BitmapImage顶部,然后根据需要绘制线条。 xaml文件中的代码:

<Grid>
    <Image Source="C:\Users\sm143444\Desktop\download.jpg" />
    <Canvas Background="Transparent"  x:Name="draw" />
</Grid>

来自Xaml.cs的代码:

public MainWindow()
    {
        InitializeComponent();
        Point startPoint = new Point(50, 50);
        Line newLine = new Line();
        newLine.Stroke = Brushes.Black;
        newLine.Fill = Brushes.Black;
        newLine.StrokeLineJoin = PenLineJoin.Bevel;
        newLine.X1 = startPoint.X;
        newLine.Y1 = startPoint.Y;
        newLine.X2 = startPoint.X + 100;
        newLine.Y2 = startPoint.Y + 100;
        newLine.StrokeThickness = 2;
        this.draw.Children.Add(newLine);
    }

output

或者您甚至可以在图像和线条中添加ZIndex,以便将它们放置在画布上的不同图层上。