【发布时间】:2010-12-06 22:02:28
【问题描述】:
我正在使用 QGLWidget(OpenGL 的 Qt 小部件)并希望能够将小部件显示的屏幕捕获为 JPEG 文件。我怎样才能做到这一点?是否有一个函数可以将小部件上当前显示的内容作为图像返回?
【问题讨论】:
我正在使用 QGLWidget(OpenGL 的 Qt 小部件)并希望能够将小部件显示的屏幕捕获为 JPEG 文件。我怎样才能做到这一点?是否有一个函数可以将小部件上当前显示的内容作为图像返回?
【问题讨论】:
通常使用 OpenGL,您会使用 glReadPixels() 函数从帧缓冲区中读取数据。这会将帧缓冲区内容放入您分配的缓冲区中。然后,您需要一个将其转换为 JPEG 的函数。
但是,当您使用QGLWidget 时,您可以使用其grabFrameBuffer() 方法以QImage 对象的形式获取帧缓冲区内容。这可能是更好的方法。您可以抓取帧缓冲区内容,然后使用QImage::save() 保存到文件。
如果你移到 Qt 5 的 QOpenGLWidget,你会发现它有一个类似的
grabFrameBuffer() 方法。
【讨论】:
QPixmap pixmap = QPixmap::grabWidget( &widget );
pixmap.save("widget.png");
【讨论】:
这是将小部件保存为图像的最简单方法,适用于 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);
【讨论】:
为什么不使用非常简单的咒语QPixmap::grabWindow( m_widget->winId() ).save( "/some/file.jpg" )
【讨论】:
QImage img(mywidget.size());
QPainter painter(&img);
mywidget.render(&painter);
img.save("/some/file.jpg");
【讨论】:
widget->setVisible(true) 也很重要。
QWidget 进行离屏渲染,则使用setVisible() 根本不会很好地工作,因为小部件将短暂显示。