【问题标题】:WPF, C#: Draw a line onto existing bitmap in image controlWPF,C#:在图像控件中的现有位图上画一条线
【发布时间】:2011-07-11 00:09:06
【问题描述】:

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

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

我最初想创建一个 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 论坛页面上发布了它,但到目前为止没有答案。

【问题讨论】:

  • 把图像和线条放在同一个网格单元格中,它们会重叠。

标签: wpf bitmap drawing


【解决方案1】:

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

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

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

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

然后,在您的单击事件处理程序中,您可以使线条可见并为其提供所需的坐标:

line.Visibility = Visible;
line.X1 = mouse_x;
line.Y1 = mouse_y;
line.X2 = ...;
line.Y2 = ...;

【讨论】:

  • 感谢两位的帮助!但是,我在图像 (WPF) 上附加了一个缩放,这仅需要 1 个内容。当我添加该行时,我得到: 属性“内容”被设置了不止一次。我会尝试在缩放后添加它。还有什么办法吗?
  • 有效!当然,这条线不会缩放,但现在这没问题。非常非常感谢!
【解决方案2】:

您可以在您的 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,以便将它们放置在画布上的不同图层上。

【讨论】:

  • 那么如何将带有线条的图片保存为图片呢?
  • @CarlosLiu 抱歉回复晚了。您可以通过将图像绘制为画布的背景来实现这一点,而不是覆盖,然后将画布保存为图像。
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2011-01-28
  • 2020-12-20
相关资源
最近更新 更多