【问题标题】:Drawing interactively lines over a Bitmap在位图上交互式绘制线条
【发布时间】:2013-12-14 15:56:33
【问题描述】:

我需要允许用户在位图上画线。线条应该以交互方式绘制,我的意思是使用典型代码执行的操作,为用户提供关于所绘制内容的视觉反馈:

private void MainPictureBox_MouseDown( object sender, MouseEventArgs e)
{
   DrawingInProgress = true ;                
   Origin = new Point (e.X, e.Y);              
}

private void MainPictureBox_MouseUp(object sender, MouseEventArgs e)
{          
   DrawingInProgress = false ;
}

private void MainPictureBox_MouseMove(object sender, MouseEventArgs e)
{
  if (!DrawingInProgress) return ;
  End = new Point (e.X, e.Y);
  using( Pen OverlayPen = new Pen( Color .Red, 1.0f))        
  using (Graphics g = MainPictureBox.CreateGraphics())        
  {
       g.DrawLine(OverlayPen, Origin, End);      
     }
}

当然,我在 MainPictureBox_MouseUp 中使用 List.Add 来跟踪点,以便在 Paint 事件中绘制线条(为简单起见,代码未显示)

如果没有背景图像,只需用背景颜色覆盖前一行,就可以很好地完成,例如:

 g.DrawLine(BackgroundColorPen, Origin, PreviousEnd);     
 g.DrawLine(OverlayPen, Origin, End);     

但这在不统一的背景下是不可能的。

使由点定义的矩形无效:Origin、PreviousEnd 然后使用 Update() 会使渲染变得非常混乱。我想知道如何执行此任务,我正在考虑这些可能的方法:

  1. 在透明位图上绘制线条,然后在图片框上绘制位图。我想对于大图像,出于性能原因,这根本不可行。
  2. 使用 Picture.BackgroundImage 作为位图,然后在 Picture.Image 上绘图,但我无法弄清楚这如何真正节省时间
  3. 使用双缓冲?怎么样?
  4. 在图片框上堆叠不同的控件(面板?),使其透明(可能吗?)然后在其上绘制。

有人能给出最佳方向的提示吗?我真的迷路了。

【问题讨论】:

  • 为此我强烈推荐 WPF。 winforms 是一项非常古老的技术,没有人再关心了,由于缺乏硬件加速,它不支持丰富、快速、交互式的 UI。由于 WPF 基于 DirectX 的硬件加速底层引擎,因此 WPF 可以更好地处理基于图形的 UI。
  • 感谢您的提示,但我正在编辑现有程序,因此无法更改我正在使用的技术。
  • 对于“交互式”行使用ControlPaint.DrawReversibleLine()。如果您两次绘制同一条线,它将恢复原来的位置。堆叠控件在大多数情况下根本不起作用。抱歉,“透明度”在 WinForms 中是用词不当。

标签: c# winforms


【解决方案1】:

对我有用的解决方案如下:

  1. 创建透明面板;
  2. 将其放在位图上,使它们完全重叠;
  3. 使用适当的鼠标事件在面板上绘图;
  4. 当然,没有必要取消之前的形状:这是一个误导性的问题。将记录在提供给 Paint 事件的适当列表中的永久形状与先前绘制的将不会在下一个 Paint 事件中再次绘制的瞬态形状区分开就足够了;
  5. 确保使用 PaintEventArgs 提供的图形在 Paint 事件中执行所有绘图。感谢@HansPassant 在另一篇文章中强调了这一点。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2016-05-08
    • 2013-06-29
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2021-01-07
    • 2014-03-24
    相关资源
    最近更新 更多