从字节数组快速更新QPixmap

时间:2010-10-19 13:17:01

标签: c++ windows qt

我正在开发一个视觉应用程序,我需要使用QPixmap对象从屏幕上显示的相机中获得“实时视图”。我们将以30帧/秒的速度连续更新屏幕。

我的问题是这个应用程序必须运行在一些3-5岁的计算机上,按照今天的标准,这些计算机速度很慢。所以我想做的是能够直接写入QPixmap内部的显示字节数组。在完成程序代码之后,几乎可以选择更改Pixmap的内容,从而导致创建新的QPixmap。这是我试图驾驶的开销。

此外,我想阻止所有新的/删除事件发生,只是为了控制内存碎片。

有什么建议吗?

2 个答案:

答案 0 :(得分:13)

首先,most important piece of information关于Qt中的“图片”类:

  

QImage专为I / O设计和优化,适用于直接像素访问和操作,而QPixmap专为在屏幕上显示图像而设计和优化。

这意味着QPixmap是您平台的原生图像格式的通用表示:Unix上为Pixmap,Windows上为HBITMAP,Mac上为CGImageRef。 QImage是一种“具有操作的像素数组”类型。

我假设以下内容:

  • 您正在以特定像素格式阅读原始相机框架
  • 确实存在内存碎片问题(而不是情感上的问题)

我的建议是使用QImage而不是QPixmap。具体来说,有一个构造函数接受原始字节数组并直接将其用作像素缓冲区:

QImage::QImage(uchar *data, int width, int height, int bytesPerLine, Format format)

构建了QImage后,使用QPainter以所需频率将其绘制到窗口小部件。但请注意:

  • 如果您正在阅读原始相机帧,则可能仍需要进行格式转换。两次,在最坏的情况下:相机➔Qimage➔平台位图。
  • 使用QPixmap和QImage时,无法避免来自免费商店的内存分配:它们是implicitly shared classes并且必须从免费商店分配内存。 (另一方面,这意味着不应该明确地新建/删除它们。)

我们的团队设法在仅使用Qt(尽管帧速率较低)的Atom驱动的计算机上平滑地显示全屏压缩视频。但是,如果这不能解决您的问题,我将绕过Qt并使用本机绘图API。如果您绝对需要平台独立性,那么OpenGL或SDL可能是很好的解决方案。

答案 1 :(得分:0)

我发现QImages在直接I / O操作方面更快。

您是否可以提供有关您正在获取和尝试使用QPixmap的更多详细信息?