[英]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.