2010-07-25 198 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方法将复制数据。