c++ - 从字节数组快速更新 QPixmap

标签 c++ windows qt

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

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

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

有什么建议吗?

最佳答案

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

QImage is designed and optimized for I/O, and for direct pixel access and manipulation, while QPixmap is designed and optimized for showing images on screen.

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

我假设如下:

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

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

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

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

  • 如果您正在读取原始相机帧,可能仍然需要进行格式转换。两次,在最坏的情况下:Camera ➔ Qimage ➔ Platform Bitmap。
  • 在使用 QPixmap 和 QImage 时,您无法避免从空闲存储区分配内存:它们是 implicitly shared classes并且必须从空闲存储中分配内存。 (另一方面,这意味着不应该明确地新建/删除它们。)

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

关于c++ - 从字节数组快速更新 QPixmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968731/

相关文章:

c++ - 为 OpenGL 设置剪切矩形?

c++ - 使用 getline 从文件读取的垃圾值

c++ - 删除全局隐式函数 - 避免模棱两可的运算符

qt - 扩展 TabViewStyle styleData

c++ - 对 cv::calcOpticalFlowPyrLK 的 undefined reference

c++ - std::apply的enable_if-like SFINAE表达式

c++ - 调试器已附加 - cscript

c - 如何遍历目录并对每个文件执行任务

windows - 是否可以合理地绕过扫描工作目录的防病毒软件?

c++ - 如何在 QML 场景上绘制 3D 线?