在Bitmap上以交互方式绘制线条

时间:2013-11-28 14:49:55

标签: c# winforms

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

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. 在透明位图上绘制线条,然后在Picturebox上绘制位图。我想,对于大型影像来说,这对于演出来说根本不可行。
  2. 使用Picture.BackgroundImage作为位图,然后在Picture.Image上绘图,但我无法弄清楚这是如何真正实现这一天的
  3. 使用双缓冲?怎么样?
  4. 在pictureBox上堆叠一个不同的控件(面板?),使其透明(是否可能?)然后将其覆盖。
  5. 有人能给出最佳方向的暗示吗?我真的迷路了。

1 个答案:

答案 0 :(得分:0)

为我工作的解决方案如下:

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