更新图形而不删除上一个图形

时间:2015-02-25 08:32:13

标签: c# drawing

我是在绘图方法中创建的

private void draws()
{
 Bitmap bmp = new Bitmap(pictureBox17.Width, pictureBox17.Height);
 using (Graphics g = Graphics.FromImage(bmp))
            {
                //define area do pictureBox17 e preenche a branco
                Brush brush = new SolidBrush(Color.White);
                Rectangle area = new Rectangle(0, 0, pictureBox17.Width, pictureBox17.Height);
                g.FillRectangle(brush, area);
                //desenha as linhas do rectangulo
                g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp);
// some more lines
}
 pictureBox17.Image = bmp;
}

它完全符合我的要求。但想象一下,在此之后我想要更新完全相同的绘图,添加几行,而不必再画全部,这可能吗?显然我正在使用方法

draws();

然后我想添加一些东西,任何提示?

2 个答案:

答案 0 :(得分:2)

这样做的方法是创建一个DrawAction类,其中包含您要绘制的内容所需的所有数据:Point数据,Pen或{{1等等。

然后您创建并管理Brush,然后您可以选择:

  • 你要么完成所有的绘画活动,要么现场直播。在List<DrawAction> drawActionsPaint(或任何控件,PictureBox事件)的Panel事件中,循环显示列表.. < / p>

  • ..或者您将新动作添加到正在构建的Paint中。

什么是更好的真正取决于:您是否希望通过用户操作进行动态绘图?你想要一个撤销/重做选项吗?然后实时绘制控制界面更适合。

或者是要修复或从固定数据集派生的事情列表,并且最终要保存到磁盘。这听起来更像是将绘制到位图中。

两者也可以组合,可以收集一些操作,同时保留撤消选项(通过删除最后一个列表项)并提供应用按钮来泵他们进入位图..

注意:绘制内容的关键是将绘图数据保留在列表中,以便您可以在需要时再次使用它,展开并删除列表甚至改变它:这将是一个简单的双线程,可以覆盖所有操作并更改Bitmap Image的{​​{1}}或ColorWidth或转移LineStyle一点等等!

当您创建Pen课程时,如果您可以决定需要哪些操作,则会有所帮助。如果您仍然可以参加更长时间的课程,并且有足够的成员来处理Points班级提供的所有选项:DrawActionGraphics,{{1 }}属性,Drawxx甚至可能缩放..

对于初学者来说,一个Fillxxx一个Pen和一个Colors会有...

以下是一个简单类,List<Point>事件,添加一些测试操作的代码和float PenWidth的示例:

  • 用于进行实时绘图的按钮和..
  • ..一个将操作应用于将操作应用于Color的位图Paint

测试数据是一个both和一组Image

您应该通过定义PictureBox并使用您想要使用的所有类型的绘图操作来开始改进它!这将更好,更容易理解我编码的cheapo字符类型;-)类型可以包括Line,然后一些。只需一点额外,您还可以使用Image,GraphicsPath,Spline ..而其他数据可以控制Polylines等。

Enum

两者的结果看起来都一样:

enter image description here

答案 1 :(得分:1)

尝试在函数外部创建Bitmap以保留它,现在的方式就是在函数完成后处理Bitmap元素。

然后,您可以执行类似

的操作
Bitmap bmp = new Bitmap(pictureBox17.Width, pictureBox17.Height);
    private void draws()
    {
     if (bmp ==null)
     using (Graphics g = Graphics.FromImage(bmp))
                {
                    //define area do pictureBox17 e preenche a branco
                    Brush brush = new SolidBrush(Color.White);
                    Rectangle area = new Rectangle(0, 0, pictureBox17.Width, pictureBox17.Height);
                    g.FillRectangle(brush, area);
                    //desenha as linhas do rectangulo
                    g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp);
                 }
   else {
         using (Graphics g = Graphics.FromImage(bmp))
         {
            g.DrawLine(new Pen(Color.Black), esp, esp, esp, yWcorrigidoesp);
         }
    // some more lines
    }
     pictureBox17.Image = bmp;
    }

只是为了让你开始.. :))

或者你可以将bmp传递给draw函数,如果你使用这个方法在不同的时间绘制多个bmp