C# 加速图像处理

C# 加速图像处理,c#,gdi+,C#,Gdi+,这是我问题的后续部分 我应用了调整大小/重采样代码,但没有任何区别。我确信我对GDI+等的了解还不够,所以如果我看起来有点糊涂,请原谅 我正在使用第三方图形库(Piccolo)。除了均匀地包裹GDI+,我不知道它在引擎盖下做什么 我的测试是以不同的缩放级别旋转显示器-这是导致性能下降最严重的过程。我知道我正在旋转相机视图。在缩放级别高达1.0时,不会降低性能,使用鼠标滚轮可以平滑旋转。图像必须以1.0的缩放级别缩放到每像素1m的CAD单位。我已经调整了图像的大小/重新采样以与之匹配。根据上一个问

这是我问题的后续部分

我应用了调整大小/重采样代码,但没有任何区别。我确信我对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;
            }
        }
我想这会加快重采样速度,但据我所知,在尝试以高缩放级别旋转显示器时,对性能没有影响。用户a性能分析器(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(图,b)中

边界当然是图像的边界。catch块用于捕获GDI+OOM异常,在高缩放级别时,这些异常看起来更糟糕

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

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

那么是否还有其他调用g.DrawImage(image,b);我可以用吗?还是我要受图形引擎的摆布?不幸的是,它是如此嵌入,这将是很难改变我


再次感谢

如果我没弄错的话,我想你用的是皮马格纳德短笛物体。调用该方法的数量可能会增加,因为Piccolo引擎根据缩放级别(某种消隐)在用户屏幕上跟踪“真实”绘图区域,并仅绘制可见的节点。如果场景中有大量PImageNode对象并进行ZoomOut,则需要绘制PImageNode对象的数量,因此需要调用该方法

表演怎么样:

1) 尝试使用SetStyle(ControlStyles.DoubleBuffer,true);PCanvas(如果尚未设置)

2) 看这里


问候。

如果我没弄错的话,我想你用的是皮马根诺德。调用该方法的数量可能会增加,因为Piccolo引擎根据缩放级别(某种消隐)在用户屏幕上跟踪“真实”绘图区域,并仅绘制可见的节点。如果场景中有大量PImageNode对象并进行ZoomOut,则需要绘制PImageNode对象的数量,因此需要调用该方法

表演怎么样:

1) 尝试使用SetStyle(ControlStyles.DoubleBuffer,true);PCanvas(如果尚未设置)

2) 看这里


问候。

谢谢-很高兴知道其他人对短笛有所了解。是,我正在使用PImage节点。我启用了双缓冲。只有一个图像,当我放大而不是缩小时,问题会增加。写得非常好的.NET库,几年前我将其用于工业控制系统编程IDE开发,并取得了很好的效果。但糟糕的是,它依赖GDI+。Direct2D将是此类应用的发展方向,您将获得更好的性能。据我所知,Piccolo是一个基于大学的项目,至少在最初(不知道当前状态)也在寻求Mono支持。我相信这是他们使用纯GDI+的原因之一。谢谢-很高兴知道有人知道关于短笛的一些事情。是,我正在使用PImage节点。我启用了双缓冲。只有一个图像,当我放大而不是缩小时,问题会增加。写得非常好的.NET库,几年前我将其用于工业控制系统编程IDE开发,并取得了很好的效果。但糟糕的是,它依赖GDI+。Direct2D将是此类应用的发展方向,您将获得更好的性能。据我所知,Piccolo是一个基于大学的项目,至少在最初(不知道当前状态)也在寻求Mono支持。我相信这是他们使用纯GDI+的原因之一。代码使用两个不同的对象,一个是命名图像,另一个是命名图像。准确在这里很重要。如果这个图形库应用了一个转换(graphics.Transform不是身份矩阵),那么对图像进行重采样不会让你领先。嗯,我没有注意到这一点。我将再次检查这段代码。你对重采样的评论当然是对的。目前,我正在将图像重新采样到合适的大小,并将其颜色深度更改为8位,以尝试使图像更小。我不确定这是否有多大影响。除非我能找到某种方法来减少对g.DrawImage的调用,或者找到一种更快地执行g.DrawImage的方法(使用非托管代码?),否则我想我不会去任何地方。代码使用两个不同的对象,一个是命名图像,另一个是命名图像。准确在这里很重要。如果这个图形库应用了一个转换(graphics.Transform不是身份矩阵),那么对图像进行重采样不会让你领先。嗯,我没有注意到这一点。我将再次检查这段代码。你对重采样的评论当然是对的。目前,我正在将图像重新采样到合适的大小,并在尝试中将其颜色深度更改为8比特