QImage与QPixmal视频播放

2019-11-05

  新的项目中,需要从传感器实时获取图片并刷新显示,这边已有的代码里混用了QImage 与QPixmap。从QImage 转换为QPixmap 极为耗时,1000*1000 的size,debug模式下竟然需要12ms,CPU单核80%左右。导致UI很卡,这实在就过分了。我带有一些疑惑。其实,看一下定义就知道了。
The QPixmap class is an off-screen image representation that can be used as a paint device.
The QImage class provides a hardware-independent image representation that allows direct access to the pixel data, and can be used as a paint device.

  QWidget使用 pixmap展示图片是比较方便的。如果使用painter.drawImage(QImage),则容易报access violation 错误,导致程序崩溃。而我们获取的数据,都是优先转为QImage的,缓存成QImage后方便后续的处理。从QPixmap::fromImage(QImage) 转换,需要占用单核计算量,且耗时12ms,实在令人惊诧。后来发现是没有带有Qt::NoFormatConversion 标志位参数,加上只有CPU占用下降了60%,且在release 模式下耗时也下降到3ms左右,已经对UI线程的影响较小了。我们便没有继续优化。因为我们项目毕竟不是toC的,视频播放帧率不高,且播放操作非常用操作,没有必要弄成复杂方式。

  对于此需求,仍有三种优化方式:
1,在另一线程做QImage 到QPixmap 的转换操作。
2,使用QPixmap 的 loadFromData接口,可能fromImage就是调用此接口实现的,并没有什么意义。
3,使用OpenGL,QImage可以直接转化为贴图,使用硬件加速。

 

  1. https://doc.qt.io/qt-5/qpixmap.html
  2. https://interest.qt-project.narkive.com/bQJNQHCv/convertion-between-qimage-to-qpixmap-taking-to-much-time
  3. https://stackoverflow.com/questions/10307860/what-is-the-difference-between-qimage-and-qpixmap
  4. https://lists.qt-project.org/pipermail/interest/2015-October/019313.html
  5. https://bugreports.qt.io/browse/QTBUG-20026
如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)