我想将 QImage 绑定(bind)到 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);
我的程序需要处理非常大的图像。
最佳答案
尝试声明 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 的非常量方法将复制数据。
关于qt - QT 中非常大的 QImage 和内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328254/