2010-07-25 236 views
2

我想將QImage綁定到MMF文件來操作映像,而不會直接在光盤上花費內存。不幸的是,我的代碼在內存中創建一個副本。QT中的非常大的QImage和內存映射文件

QFile file("Boston City Flow.jpg"); 
if(!file.open(QIODevice::ReadOnly)) 
    QMessageBox::information(this, "Error", "Error"); 

qint64 size = file.size(); 
unsigned char *mmf = file.map(0, size); 

QImage image; 
image.loadFromData(mmf, size, NULL); 

我的程序需要處理非常大的圖像。

回答

5

嘗試用MMF聲明常量:

const unsigned char* mmf = file.map(0, size); 

,然後看看在QImage的構建函數,尤其是

QImage(const uchar*, int width, int height, Format) 

的QImage :: QImage的(常量UCHAR *數據,詮釋寬度,高度INT ,格式格式)

文檔說:

「緩衝區必須保持有效次使得QImage的生命和所有尚未被修改或從原始緩衝區分離的副本變得粗糙。圖像不會在銷燬時刪除緩衝區。 與使用非常量數據緩衝區的類似QImage構造函數不同,此版本不會改變緩衝區的內容。例如,調用QImage :: bits()將返回圖像的深層副本,而不是傳遞給構造函數的緩衝區。這允許從原始數據構建QImage的效率,而不會改變原始數據。「

請注意,非const uchar *版本立即複製,因此請確保通過一個const uchar *。另請注意,調用QImage的非const方法將複製數據。