我正在开发一个视觉应用程序,我需要使用 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/