我正在开发一个视觉应用程序,我需要使用QPixmap对象从屏幕上显示的相机中获得“实时视图”。我们将以30帧/秒的速度连续更新屏幕。
我的问题是这个应用程序必须运行在一些3-5岁的计算机上,按照今天的标准,这些计算机速度很慢。所以我想做的是能够直接写入QPixmap内部的显示字节数组。在完成程序代码之后,几乎可以选择更改Pixmap的内容,从而导致创建新的QPixmap。这是我试图驾驶的开销。
此外,我想阻止所有新的/删除事件发生,只是为了控制内存碎片。
有什么建议吗?
答案 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以所需频率将其绘制到窗口小部件。但请注意:
我们的团队设法在仅使用Qt(尽管帧速率较低)的Atom驱动的计算机上平滑地显示全屏压缩视频。但是,如果这不能解决您的问题,我将绕过Qt并使用本机绘图API。如果您绝对需要平台独立性,那么OpenGL或SDL可能是很好的解决方案。
答案 1 :(得分:0)
我发现QImages在直接I / O操作方面更快。
您是否可以提供有关您正在获取和尝试使用QPixmap的更多详细信息?