加快图像处理速度

时间:2011-07-05 19:55:25

标签: c# gdi+

这是我的问题How To Handle Image as Background to CAD Application

的后续内容

我应用了调整大小/重新采样代码,但没有任何区别。我相信我对GDI +等不太了解所以请原谅我,如果我看起来很混乱。

我正在使用第三方图形库(Piccolo)。除了它甚至包装GDI +之外,我不知道它是否足以确定它在引擎盖下做了什么。

我的测试是以不同的缩放级别旋转显示器 - 这是导致性能最差的过程。我知道我在旋转相机视图。在最高1.0的缩放级别下,没有性能下降,使用鼠标滚轮可以平滑旋转。必须将图像缩放到每像素1米的CAD单位,缩放级别为1.0。我已调整大小/重新采样图像以匹配该图像。我根据上一个问题给出的代码尝试了不同的方法来加快速度:

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;
            }
        }

我想这可以加快重新采样,但据我所知,在尝试以高变焦级别旋转显示时,对性能没有影响。用户性能分析器(ANTS)我能够找到导致性能损失的代码:

 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(image,b);

当然,界限是形象的界限。 catch块用于捕获GDI + OOM异常,这些异常在高缩放级别下也会变得更糟。

调用它的次数似乎随着缩放级别的增加而增加....

在相机视图的代码中还有另一个命中,但我还没有足够的信息来解释它,除了这似乎绘制了连接到相机的所有层 - 以及它们上面的所有对象 - 当时相机视图矩阵和剪辑应用于paintContext(无论这意味着什么)。

还有一些其他调用g.DrawImage(image,b);我可以用吗?还是我受图形引擎的支配?不幸的是,它是如此嵌入,以至于我很难为我改变

再次感谢

1 个答案:

答案 0 :(得分:1)

我认为你使用,如果我没有错, PImageNode 对象形式Piccolo。对该方法的调用量可能会增加,因为Piccolo引擎会根据缩放级别(剔除的类型)跟踪用户屏幕上的“真实”绘图区域,并仅绘制可见的节点。如果场景中有很多 PImageNode 对象,并且 ZoomOut ,则会增加需要绘制的 PImageNode 对象的数量,因此调用该方法。

表现如何:

1)尝试使用SetStyle(ControlStyles.DoubleBuffer,true); PCanvas(如果还没有设置)

2)看这里CodeProject

问候。