QT中的非常大的QImage和内存映射文件

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

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

1个回答

5

尝试使用const声明mmf:

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

然后看一下QImage构造函数,特别是

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

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

文档说明:

“缓冲区必须在 QImage 的整个生命周期和所有未修改或从原始缓冲区分离的副本中保持有效。图像不会在销毁时删除缓冲区。 [...] 与使用非常量数据缓冲区的类似 QImage 构造函数不同,此版本永远不会更改缓冲区的内容。例如,调用 QImage::bits() 将返回图像的深度副本,而不是传递给构造函数的缓冲区。这允许高效地从原始数据构造 QImage,而无需更改原始数据的可能性。“

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接