簡體   English   中英

QImage內存不足

[英]QImage out of 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()";
}

看起來也不例外。

您的內存不足。

而且我什至不確定QImage是否可以處理如此大的圖像。

converToGLFormat不會在GPU上分配任何內容,它只是將圖像轉換為ARGB8888格式並具有正確的字節順序,即使其適合通過glTex(Sub)Image2D上傳,請參見此處 在Qt 5.2中,如果要處理紋理,還可以考慮使用QOpenGLTexture,如果具有正確的GPU功能,則可以避免該轉換步驟。

convertToGLFormat沒有真正的錯誤處理方法,如果您的內存不足或圖像格式不正確,它將以Q_ASSERT崩潰。

作為一種解決方法,您可以嘗試分配與convertToGLFormat相同大小的圖像,如果成功,則釋放該圖像並調用該函數,因為它也可能成功,否則,請跳過該圖像。

QImage dummy(_data.size(), QImage::Format_ARGB32);
if (!dummy.isNull()) {
    dummy = QImage(); // free the image
    _gldata = QGLWidget::convertToGLFormat(_data);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM