QImage内存不足

时间:2014-02-21 14:53:55

标签: c++ qt opengl memory

我有一个分类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()";
}

看起来它不是例外。

2 个答案:

答案 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);
}