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

ドキュメントは言う:

「バッファは、QImage と、変更されていない、または元のバッファから切り離されていないすべてのコピーの存続期間中、有効なままである必要があります。イメージは、破棄時にバッファを削除しません。[...] 同様の QImage コンストラクタとは異なり、非 const データ バッファ, このバージョンはバッファの内容を決して変更しません. たとえば, QImage::bits() を呼び出すと, コンストラクタに渡されたバッファではなく, イメージのディープ コピーが返されます.生データが変更される可能性なしに、生データから QImage を構築する効率。」

非 const uchar* バージョンはすぐにコピーするので、必ずconst uchar* を渡すようにしてください。また、QImage の const 以外のメソッドを呼び出すと、データがコピーされることに注意してください。

于 2010-07-25T21:54:55.180 に答える