从字节数组快速更新QPixmap

pho*_*tom 5 c++ windows qt

我工作的一个视觉应用,我需要有一个"实时取景"从相机显示使用的QPixmap对象在屏幕上.我们将以30帧/秒的速度连续更新屏幕.

我的问题是,这个应用程序必须运行在一些3-5岁的计算机上,按照今天的标准,这些计算机速度很慢.所以我想做的是能够直接写入QPixmap内部的显示字节数组.通过程序代码会后,正在创建的改变在新的QPixmap的点阵图结果内容几乎选项.这是我试图驾驶的开销.

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

有什么建议?

and*_*ref 14

首先,关于Qt中"图片"类的最重要信息:

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

这意味着QPixmap是平台本机图像格式的通用表示:Pixmap在Unix上,HBITMAP在Windows上,CGImageRef在Mac上.QImage是"具有操作的像素阵列"类的类.

我假设以下内容:

  • 您正在以特定像素格式阅读原始相机帧
  • 真的有内存碎片问题(而不是情感上有它们)

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

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

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

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

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