2011-07-05 59 views
1

这是我的问题How To Handle Image as Background to CAD Application加快图像处理

后续我应用的尺寸/重新采样代码,但它没有做任何区别。我相信我对GDI +等知识不够,所以请原谅我,如果我似乎混乱。

我正在使用第三方图形库(Piccolo)。我无法确定它究竟是在做什么,而不是直接包装GDI +。

我的测试是在不同的缩放级别旋转显示 - 这是导致性能最差的过程。我知道我正在旋转相机视图。在缩放级别达到1.0时,没有性能下降,使用鼠标滚轮可以平滑旋转。图像必须以1.0的缩放级别缩放到每像素1m的CAD单位。我已调整大小/重新采样图像以匹配。我曾尝试不同的方法基于最后一个问题给我的代码,以加快这:

public static Bitmap ResampleImage(Image img, Size size) { 
      using (logger.VerboseCall()) { 

       var bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb); 
       using (var gr = Graphics.FromImage(bmp)) { 
        gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low; 
        gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed; 
        gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;     

        gr.DrawImage(img, new Rectangle(Point.Empty, size)); 
       } 
       return bmp; 
      } 
     } 

我想这加速了重采样,但据我可以告诉有尝试时对性能没有影响以高缩放级别旋转显示器。用户性能分析器(蚂蚁),我能够找到导致性能命中代码:

protected override void Paint(PPaintContext paintContext) { 
      using (PUtil.logger.DebugCall()) { 
       try { 
        if (Image != null) { 
         RectangleF b = Bounds; 

         Graphics g = paintContext.Graphics; 

         g.DrawImage(image, b); 
        } 
       } 
       catch (Exception ex) { 
        PUtil.logger.Error(string.Format("{0}\r\n{1}", ex.Message, ex.StackTrace)); 
        //----catch GDI OOM exceptions 
       } 
      } 
     } 

对性能的影响是完全g.DrawImage(图像,B);

边界是图像的边界当然。 catch块在那里可以捕获GDI + OOM异常,这在高缩放级别下看起来更糟糕。

的时候这就是所谓的数字似乎随着缩放级别增加....

有代码画相机另外一个打击,但我没有足够的信息来解释但不同之处在于这似乎画了连接到摄像机的所有图层 - 以及我假设的所有对象 - 当摄像机视图矩阵和剪辑应用于paintContext时(无论如何)。

所以有一些其他调用g.DrawImage(图像,B);我可以使用?还是我在图形引擎的摆布?不幸的是做嵌入式,这将是非常难以改变的,我

再次感谢

+0

该代码使用两个不同的对象,一个名为Image,另一个名为image。准确性在这里很重要。如果此图形库应用了转换(Graphics.Transform不是单位矩阵),那么重新采样图像不会让您前进。 –

+0

嗯 - 我没有注意到。我会再次检查这段代码。您对重新采样的评论当然是正确的。目前,我正在将图像重新采样到合适的尺寸,并将图像的颜色深度改为8位,以减小图像尺寸。我不确定这有什么影响。除非我可以找到某种方法来减少对g.DrawImage的调用,或者找到一种更快执行的方法(使用非托管代码?),我认为我不会去哪里。 – ScruffyDuck

回答

1

我想您在使用,如果我不误,PImageNode对象形式短笛。由于Piccolo引擎根据缩放级别(类型的“清除”)在用户屏幕上追踪“真实”绘图区域,并仅绘制可见节点,因此该方法的调用数量可能会增加。如果您的场景中有很多PImageNode对象,并且制作ZoomOut它会增加数量PImageNode对象需要绘制,因此调用该方法。

怎么样的表现:

1)尝试使用的SetStyle(ControlStyles.DoubleBuffer,真);在PCanvas的(如果它尚未设置好的了)

2)看这里CodeProject

问候。

+0

谢谢 - 很高兴知道别人知道关于短笛的一些信息。是的,我正在使用PImage节点。我启用了双缓冲。只有一个图像,并且随着我放大而不是放大,问题会增加。 – ScruffyDuck

+0

真的很好写的.NET库,我多年前用它来编写IDE开发的工业控制系统,效果很好。 – Tigran

+0

尽管它依赖于GDI +,但它太糟糕了。 Direct2D将成为这种应用的途径,并且你将获得更好的性能。 –