代码之家  ›  专栏  ›  技术社区  ›  Yury

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

  •  2
  • Yury  · 技术社区  · 14 年前

    我想把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 回复  |  直到 14 年前
        1
  •  5
  •   Frank Osterfeld    14 年前

    尝试声明mmf const:

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

    然后看一看QImage,尤其是

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

    “缓冲区必须在QImage和所有未被修改或从原始缓冲区分离的副本的整个生命周期内保持有效。销毁时图像不会删除缓冲区。 [...]

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