none
Image绘图的问题求教 RRS feed

  • 问题

  • 最近苦恼于WPF的绘图,不得已只能考虑使用Imagesource绘图。

    我现在使用如下代码:画出一个source,然后赋给Image控件

                var streamDrawing = new StreamGeometry();
                using (var ctx = streamDrawing.Open())
                {
                    ctx.BeginFigure(pts[0], true, false);

                    for (int i = 1; i < pts.Length; i++)
                        ctx.LineTo(pts[i], true, true);
                }

                var pen = new Pen(Brushes.Red, thickness);
                pen.DashCap = PenLineCap.Round;
                pen.StartLineCap = PenLineCap.Round;
                pen.EndLineCap = PenLineCap.Round;
                //pen.DashStyle = new DashStyle(ds, 0);
                pen.MiterLimit = 1.0;
                pen.LineJoin = PenLineJoin.Round;

              
                //pathgeometry.AddGeometry(streamDrawing);
                var drawing = new GeometryDrawing(null, pen, streamDrawing);
              
                var source = new DrawingImage(drawing);
               // source.Freeze();
         
                 this.image_test.Source=source;//image_test是我使用的image控件名

    可以看到,为了使image上能保留上一次画的历史痕迹,我使用了pathgeometry,予以保留,但这样一来就严重影响了程序速度。

    因此,请教各位高手,有没有什么办法,可以既保留image以前的内容,又可以增添新的,而且速度上有保证呢?


    Best Regards! C.Lu
    2011年4月1日 7:03

答案

  • HI

    你的这个情况比较特殊,即使使用了BitmapCache,在你增加新的内容的时候,系统还是要重新做Cache的。所以性能上的提高不会很大。至于上面两位所讲的,也并无道理,可以尝试下,不过确实你可能会遇到点技术难度,毕竟WPF把这些图形上的内容简化了,我个人建议是,在图形不复杂,数量不多的情况,还是使用WPF作为解决方案好了

    不过,既要保留,又要新增。我们可以换个思路,为什么不把图形各个独立呢? 像InkCanvas一样,我们在里面画写东西,他们都是相互独立的,互不影响整体性能,而且老的能保留,新的能增加。 这样的思路就是,建立独立画板布局,在上面可增加内容,然后将整个画板作为整体 进行转换成Bitmap。可能可以是 RenderTargetBitmap. 或者试试VisualBrush,直接对于一个Visual来生成Brush.

     

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月4日 9:30
    版主

全部回复

  • InkCanvas?

    还有,你要了解,微软开发WPF不是为了用WPF凸显画图多么多么牛X,人家是为了让开发用户更加快捷的开发程序(因为WPF图像有了对象的概念,有了服务的概念),你要为了效率,你用DX画好了,稳稳的比WPF强。

    我觉得你总认为WPF在画图方面应该给你提供十分快,不影响程序速度的方法,如果这样,人家开发3D游戏也用WPF了。

    你想把大象装冰箱里 不是仅仅的3步就可以了,你要知道大象是多么的庞大,你非要把大象(WPF)放到小冰箱里面保存,然后你告诉大象, 你给我变形!啊? 你为什么不能变形呢?有意义么?

    你用一样错误的工具开发项目,结果就是举步维艰。

    就像你要烧水,你用双手摩擦去加热,还非要跟用火,用电烧水去比效率,那好吧,请先练铁砂掌。

    我强烈建议你试试别的方法。

     


    Stay hungry, stay foolish
    2011年4月1日 8:35
  • 囧,不过确实很难,看了你的一些列的帖子,你还是试试其他技术吧 DX  XNA等。 WPF看来帮你改不适合你的需求
    Best day, Best life
    2011年4月1日 8:40
  • 对于大量的图形绘制 而且又要性能极高的保障,WPF企鹅是很难做到。虽然据我所知 他已经实现了 BitmapCache 什么的,但是上千万的图形也是需要大量的空间和速度的损失的。 
    Best day, Best life
    2011年4月1日 8:42
  • HI

    你的这个情况比较特殊,即使使用了BitmapCache,在你增加新的内容的时候,系统还是要重新做Cache的。所以性能上的提高不会很大。至于上面两位所讲的,也并无道理,可以尝试下,不过确实你可能会遇到点技术难度,毕竟WPF把这些图形上的内容简化了,我个人建议是,在图形不复杂,数量不多的情况,还是使用WPF作为解决方案好了

    不过,既要保留,又要新增。我们可以换个思路,为什么不把图形各个独立呢? 像InkCanvas一样,我们在里面画写东西,他们都是相互独立的,互不影响整体性能,而且老的能保留,新的能增加。 这样的思路就是,建立独立画板布局,在上面可增加内容,然后将整个画板作为整体 进行转换成Bitmap。可能可以是 RenderTargetBitmap. 或者试试VisualBrush,直接对于一个Visual来生成Brush.

     

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月4日 9:30
    版主