我正在使用QGLWidget(OpenGL的Qt小工具),希望能够捕获小工具显示的屏幕作为JPEG文件。我怎样才能做到这一点呢?是否有一个函数可以将小部件上当前显示的内容作为图像返回?
gzjq41n41#
通常使用OpenGL时,可以使用glReadPixels()函数从帧缓冲区进行读取。这会将帧缓冲区内容放入您已分配的缓冲区中。然后,您需要一个将其转换为JPEG的函数。
glReadPixels()
但是,由于您使用的是QGLWidget,因此可以使用其grabFrameBuffer()方法以QImage对象的形式获取帧缓冲区内容。这可能是更好的方式。您可以获取帧缓冲区内容,然后使用QImage::save()保存到文件。
QGLWidget
grabFrameBuffer()
QImage
QImage::save()
如果你转到Qt5的QOpenGLWidget,你会发现它有类似的grabFrameBuffer()方法。
QOpenGLWidget
s6fujrry2#
QImage img(mywidget.size()); QPainter painter(&img); mywidget.render(&painter); img.save("/some/file.jpg");
3qpi33ja3#
以下是将小部件保存为图像的最简单方法,请使用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);
ahy6op9u4#
为什么不用非常简单的咒语
n8ghc7c15#
QPixmap pixmap = QPixmap::grabWidget( &widget ); pixmap.save("widget.png");
chhqkbe16#
@roop答案的改进版本。
QPixmap pixmap(mywidget.sizeHint()); QPainter painter(&pixmap); mywidget.render(&painter); pixmap.save("/some/file.png");
更改:
请注意,要实现这一点,小部件不需要显示在屏幕上。
6条答案
按热度按时间gzjq41n41#
通常使用OpenGL时,可以使用
glReadPixels()
函数从帧缓冲区进行读取。这会将帧缓冲区内容放入您已分配的缓冲区中。然后,您需要一个将其转换为JPEG的函数。但是,由于您使用的是
QGLWidget
,因此可以使用其grabFrameBuffer()
方法以QImage
对象的形式获取帧缓冲区内容。这可能是更好的方式。您可以获取帧缓冲区内容,然后使用QImage::save()
保存到文件。如果你转到Qt5的
QOpenGLWidget
,你会发现它有类似的grabFrameBuffer()
方法。s6fujrry2#
3qpi33ja3#
以下是将小部件保存为图像的最简单方法,请使用Qt 5:
ahy6op9u4#
为什么不用非常简单的咒语
n8ghc7c15#
chhqkbe16#
@roop答案的改进版本。
更改:
请注意,要实现这一点,小部件不需要显示在屏幕上。