Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字节数组快速更新QPixmap_C++_Windows_Qt - Fatal编程技术网

C++ 从字节数组快速更新QPixmap

C++ 从字节数组快速更新QPixmap,c++,windows,qt,C++,Windows,Qt,我正在开发一个vision应用程序,我需要使用QPixmap对象在屏幕上显示摄像头的“实时视图”。我们将以每秒30帧的速度连续更新屏幕 我的问题是,这个应用程序必须在一些3-5年历史的计算机上运行,按照今天的标准,这些计算机运行速度很慢。所以我想做的是能够直接写入QPixmap内部的显示字节数组。看完程序代码后,几乎所有更改Pixmap内容的选项都会创建一个新的QPixmap。这是我想利用的开销 此外,我想防止所有新的/删除发生,只是为了控制内存碎片 有什么建议吗?我发现直接I/O操作的QIMA

我正在开发一个vision应用程序,我需要使用QPixmap对象在屏幕上显示摄像头的“实时视图”。我们将以每秒30帧的速度连续更新屏幕

我的问题是,这个应用程序必须在一些3-5年历史的计算机上运行,按照今天的标准,这些计算机运行速度很慢。所以我想做的是能够直接写入QPixmap内部的显示字节数组。看完程序代码后,几乎所有更改Pixmap内容的选项都会创建一个新的QPixmap。这是我想利用的开销

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


有什么建议吗?

我发现直接I/O操作的QIMAGE速度更快

您能提供更多关于QPixmap的详细信息吗?

首先,关于Qt中的“picture”类:

QImage针对I/O、直接像素访问和操作进行了设计和优化,而QPixmap针对在屏幕上显示图像进行了设计和优化

这意味着QPixmap是平台本机映像格式的通用表示形式:Unix上为
Pixmap
,Windows上为
HBITMAP
,Mac上为
cgimaref
。QImage是一个“带操作的像素数组”类型的类

我假设如下:

  • 您正在以特定像素格式读取原始相机帧
  • 你确实有记忆碎片问题(与情绪上的问题相反)
我的建议是使用QImage而不是QPixmap。具体而言,有一个构造函数接受原始字节数组并直接将其用作像素缓冲区:

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

  • 如果您正在读取原始相机帧,可能仍需要进行格式转换。两次,在最坏的情况下:相机➔ 奇玛格➔ 平台位图
  • 当使用QPixmap和QImage时,您无法避免从空闲存储分配内存:它们是并且必须从空闲存储分配内存。(另一方面,这意味着您不应该显式地新建/删除它们。)
我们的团队仅使用Qt(尽管帧速率较低),就成功地在Atom驱动的计算机上流畅地显示了全屏压缩视频。但是,如果这不能解决您的问题,我会绕过Qt,使用本机绘图API。如果您绝对需要平台独立性,那么OpenGL或SDL可能是很好的解决方案