我有一个分类QGLWidget,我在其中显示一个图像。
对于小图片(假设1200 * 1000),它可以正常工作。
对于较大的(10000 * 6000),它会崩溃。
MyGLWidget::MyGLWidget(QImage* image, QWidget *parent) : QGLWidget(parent)
{
// ...
_data = *image;
_gldata = QGLWidget::convertToGLFormat(_data); // Crash at this point.
// ...
}
错误:
QImage: out of memory, returning null image
ASSERT: "dst.depth() == 32" in file qgl.cpp, line 2094
我有8GB的内存,应用程序需要最多。 1GB。
我该怎么办?
修改
好的,假设我的RAM耗尽,我怎么能抓住这个错误?
try
{
_gldata = QGLWidget::convertToGLFormat(_data);
}
catch(...)
{
qDebug() << "e.what()";
}
看起来它不是例外。
答案 0 :(得分:2)
你没有RAM。
我甚至不确定QImage能否处理如此大的图像。
converToGLFormat
并未在GPU上分配任何内容,它只是将图像转换为ARGB8888格式并使用正确的字节顺序,即使其适合通过glTex(Sub)Image2D
上传,请参阅{ {3}}。在Qt 5.2中,如果你正在处理纹理,你也可以考虑使用QOpenGLTexture,如果有正确的GPU功能,它可以让你避免这个转换步骤。
答案 1 :(得分:0)
convertToGLFormat
中没有真正的错误处理,如果您的RAM不足,或者图片的格式不正确,它只会与Q_ASSERT
崩溃。
作为一种解决方法,您可以尝试分配与convertToGLFormat
大小相同的图像,如果成功,则释放图像并调用该函数,因为它可能也会成功,如果没有,只需跳过图像
QImage dummy(_data.size(), QImage::Format_ARGB32);
if (!dummy.isNull()) {
dummy = QImage(); // free the image
_gldata = QGLWidget::convertToGLFormat(_data);
}