【问题标题】:Capture Qt widget as an image file将 Qt 小部件捕获为图像文件
【发布时间】:2010-12-06 22:02:28
【问题描述】:

我正在使用 QGLWidget(OpenGL 的 Qt 小部件)并希望能够将小部件显示的屏幕捕获为 JPEG 文件。我怎样才能做到这一点?是否有一个函数可以将小部件上当前显示的内容作为图像返回?

【问题讨论】:

    标签: qt opengl jpeg


    【解决方案1】:

    通常使用 OpenGL,您会使用 glReadPixels() 函数从帧缓冲区中读取数据。这会将帧缓冲区内容放入您分配的缓冲区中。然后,您需要一个将其转换为 JPEG 的函数。

    但是,当您使用QGLWidget 时,您可以使用其grabFrameBuffer() 方法以QImage 对象的形式获取帧缓冲区内容。这可能是更好的方法。您可以抓取帧缓冲区内容,然后使用QImage::save() 保存到文件。

    如果你移到 Qt 5 的 QOpenGLWidget,你会发现它有一个类似的 grabFrameBuffer() 方法。

    【讨论】:

    • 提到的两个方法是 QImage QGLWidget::grabFrameBuffer ( bool withAlpha = false ) 和 bool QImage::save ( const QString & fileName, const char * format = 0, int quality = -1 ) const .
    • 我可以将 qt Painter 捕获为视频流吗?
    【解决方案2】:
    QPixmap pixmap = QPixmap::grabWidget( &widget );
    pixmap.save("widget.png");
    

    【讨论】:

    • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of how 和 why 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit你的答案添加解释;特别是,您应该解释为什么您将 JPEG 文件命名为如此不合常规,并且您可能应该展示您如何确认这对 GL 小部件和普通 QtGui 小部件一样适用。
    【解决方案3】:

    这是将小部件保存为图像的最简单方法,适用于 Qt 5:

    QString file = QFileDialog::getSaveFileName(this, "Save as...", "name", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff *.tif);; JPEG (*.jpg *.jpeg)");
    ui->myWidget->grab().save(file);
    

    【讨论】:

    • 不幸的是,这显然(对我来说)没有捕获包含在抓取的小部件中的 QGLWidgets。
    【解决方案4】:

    为什么不使用非常简单的咒语QPixmap::grabWindow( m_widget->winId() ).save( "/some/file.jpg" )

    【讨论】:

      【解决方案5】:
      QImage img(mywidget.size());
      QPainter painter(&img);
      mywidget.render(&painter);
      img.save("/some/file.jpg");
      

      【讨论】:

      • "如果格式为 0,QImage 将尝试通过查看文件名的后缀来猜测格式。" - doc.qt.digia.com/qt/qimage.html#save
      • 如果您的小部件有孩子(并且在屏幕上不可见),拥有widget->setVisible(true) 也很重要。
      • 请注意,如果您使用QWidget 进行离屏渲染,则使用setVisible() 根本不会很好地工作,因为小部件将短暂显示。
      猜你喜欢
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      相关资源
      最近更新 更多