8

我正在使用 OpenNI 开发深度处理(Xbox Kinect、Asus Xtion 等)应用程序。

当传感器提供新的深度数据(30 或 60 fps 取决于分辨率)时,我需要一种非常简单且快速的方式在 Windows 窗体上绘图。

目前,当数据可用时,我正在从单独的线程中使双缓冲面板无效,然后在面板的绘制方法中设置位图的像素,从而产生可预测的糟糕的 5fps。

System.Drawing.Graphics 似乎缺乏设置单个像素的快速方法,除非有人可以另行指示。

我实际上只需要设置像素颜色,所以如果可能的话,我想避免使用第三方高速渲染 API,最好使用尽可能原生的东西。

有没有人有什么建议?

4

3 回答 3

7

如果您使用的是位图,那么您应该使用 LockBits 和 UnlockBits 直接访问内存中的数据。在 C# 中,您可以通过使用不安全的代码块和指针来获得一些额外的性能。

有关更多信息,请参阅此链接:http: //web.archive.org/web/20150227183132/http ://bobpowell.net/lockingbits.aspx

于 2012-06-14T15:44:15.663 回答
4

image.SetPixel()当您每帧替换很多像素并且每秒需要很多帧时,速度非常慢。

使用WriteableBitmap并调用CopyPixels会快很多

这样,您可以使用多个线程用像素数据填充数组,并在一次调用中简单地将数组blit 到图像。

编辑

请注意,WriteableBitmap 是一个 WPF 类。如果您绑定到 WinForms,您可能需要创建自己的实现。WPF/WinForms/GDI 互操作:将 WriteableBitmap 转换为 System.Drawing.Image?

于 2012-06-14T10:27:41.083 回答
0

您可以尝试使用我的LINQ 图像处理库来处理您的“缓冲区位图”。它使用非常易于访问的语法,但对于大型位图非常有效。它在Nuget上作为单个文件包含在您的项目中。

希望有帮助!

于 2012-06-14T16:30:05.057 回答