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

标签 qt image-processing qt4 memory-mapped-files qimage

我想将 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/

相关文章:

java - 如何加载位图图像并操作单个像素?

qt4 - 使用环境变量值设置包含路径

c++ - QT 重绘/重绘/更新/做某事

java - 有没有一种简单的方法可以减少索引颜色模型中的颜色数量?

c++ - 如何将 "full screen"按钮添加到最右侧的标题栏?

python - 如何找到图像中两个椭圆之间的角度?

c++ - QT C++ 传递 Widgets 到函数

qt - 模型中 dropActions 的访问值 (PySide/PyQt/Qt)

c++ - Qt - 在两种形式之间传递数据

c++ - 如何将数字 QString 转换为 int 数组?