Efficient way of displaying a continuous stream of QImages

后端 未结 3 576
故里飘歌
故里飘歌 2020-12-16 06:47

I am currently using a QLabel to do this, but this seems to be rather slow:

void Widget::sl_updateLiveStreamLabel(spImageHolder_t _imageHolderShPtr) //slot         


        
3条回答
  •  庸人自扰
    2020-12-16 06:47

    QPixmap::fromImage is not the only problem. Using QPixmap::scaled or QImage::scaled also should be avoided. However you can't display QImage directly in QLabel or QGraphicsView. Here is my class that display QImage directly and scales it to the size of the widget:

    Header:

    class ImageDisplay : public QWidget {
      Q_OBJECT
    public:
      ImageDisplay(QWidget* parent = 0);
      void setImage(QImage* image);
    
    private:
      QImage* m_image;
    
    protected:
      void paintEvent(QPaintEvent* event);
    
    };
    

    Source:

    ImageDisplay::ImageDisplay(QWidget *parent) : QWidget(parent) {
      m_image = 0;
      setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    }
    
    void ImageDisplay::setImage(QImage *image) {
      m_image = image;
      repaint();
    }
    
    void ImageDisplay::paintEvent(QPaintEvent*) {
      if (!m_image) { return; }
      QPainter painter(this);
      painter.drawImage(rect(), *m_image, m_image->rect());
    }
    

    I tested it on 3000x3000 image scaled down to 600x600 size. It gives 40 FPS, while QLabel and QGraphicsView (even with fast image transformation enabled) gives 15 FPS.

提交回复
热议问题