C#picturebox绘图速度

时间:2010-12-16 15:44:18

标签: c# c++ graphics opencv

我经历过I.方法比II慢。我的应用程序进行实时图像处理。我知道C#并不适合这个目的,但我可以将性能关键的东西分开,例如用C ++编写。我想知道为什么C#中的速度较慢而没有任何计算的简单Bitmap绘图。我的问题:C#中有更快的方法,然后我。?

I. C#:

void DrawImg(Bitmap b)
{
    pictureBox1.Image = b;
    pictureBox1.Invalidate(); 
}

II. C# + C++ + OpenCV

C# side:
[DllImport("MyWrapper.dll")]
static extern void showimg(IntPtr p, int x, int y);

void DrawImg(Bitmap b)
{
        BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        showimg(d.Scan0, d.Width, d.Height);
        b.UnlockBits(d);
}

C++ side:
extern "C" void __stdcall showimg(uchar* p, int x, int y)
{
    Mat img; // OpenCV's Mat class
    img.create(y, x, CV_8UC3);
    img.data = p;
    imshow( "Window1", img );
}

3 个答案:

答案 0 :(得分:4)

图像的PixelFormat至关重要。今天绝大多数机器都以32bpp模式运行视频适配器。这使得Format32bppPArgb的速度比其他任何速度快10倍,包括32bppArgb和24bppRgb。确保以该格式创建图像,必要时进行转换。

同样非常重要的是您以原始尺寸绘制图像。您可以在本机代码中执行此操作,但不一定使用PictureBox。如果需要调整图像大小,它会在图像上使用高质量插值。这需要时间。

答案 1 :(得分:2)

我不确定你在问什么。为什么使用C#绘图比使用C ++绘图要慢?主要是因为.NET Framework提供的标准Graphics类使用GDI +绘图方法,这些方法比C / C ++使用的GDI函数慢得多。

您是否想知道如何在C#中加速绘图?如果你发布你认为太慢的代码的相关部分,那将是最有帮助的。虽然使用Graphics库肯定比某些替代方案慢,但在大多数情况下,它的性能不是一个因素。除非你在紧凑的循环中绘制大量图形,否则你不应该遇到任何问题。如果您是,那么您的代码更有可能优化,而不是完全替换。 (当然,如果您实际上正在寻找实时图形,C#并不是您想要使用的。在您的问题中没有足够的细节可以告诉。)

或者,您可以从Win32 API P / Invoke基于GDI的绘图函数和/或考虑在C#应用程序中使用unsafe代码直接操作位图。这应该为您提供与您在问题中提到的C ++ DLL中的绘图代码非常相似的性能,因为您将使用相同的例程。但是,如果我们中的任何人要提供更具体,有用的建议,您需要再次提供更多详细信息。

答案 2 :(得分:0)

PictureBox比仅绘制图像更多的背景材料。

尝试直接绘制到paint事件中的控件/窗口。

Graphics.DrawImageUnscaled(...)可能是最快的Framework方法。

如果您想要更快,那么您需要查看DirectX或OpenGL并将绘图卸载到专用硬件。