3

我想将 QImage 绑定到 MMF 文件以操作图像,而无需直接在磁盘上占用内存。不幸的是,我的代码在内存中创建了一个副本。

 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);

我的程序需要处理非常大的图像。

4

1 回答 1

5

尝试声明 mmf const:

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

然后看看 QImage ctors,尤其是

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

QImage::QImage ( const uchar * data, int width, int height, Format 格式)

文档说:

“缓冲区必须在 QImage 的整个生命周期以及所有未修改或以其他方式与原始缓冲区分离的副本保持有效。图像不会在销毁时删除缓冲区。[...] 与类似的 QImage 构造函数不同一个非常量数据缓冲区,这个版本永远不会改变缓冲区的内容。例如,调用 QImage::bits() 将返回图像的深层副本,而不是传递给构造函数的缓冲区。这允许从原始数据构建 QImage 的效率,而不会更改原始数据。”

请注意,非 const uchar* 版本会立即复制,因此请确保传递const uchar*。另请注意,调用 QImage 的非常量方法将复制数据。

于 2010-07-25T21:54:55.180 回答