6

私はいくつかの大学のプロジェクトに取り組んでおり、メモリの問題で立ち往生しています。以下のコードを使用して、HDD に約 1.5 GB のビットマップをロードします。

Bitmap bmp = new Bitmap(pathToFile); 

問題は、新しく作成された Bitmap オブジェクトが約 3.5 GB の RAM を使用することです。これは私には理解できません (これは本当に BIG ラッパーです:E)。ピクセル配列に到達する必要があり、Bitmap クラスの使用は非常に役立ちます (後で LockBits() メソッドを使用し、バイトごとに配列を処理します) が、この場合は完全なブロッカーです。だからここに私の質問があります:

追加の 2GB を貸与せずにピクセル配列を抽出する簡単な方法はありますか?

必要な配列を抽出するためだけに c# を使用していますが、これは後で c++ で処理されます。必要なすべてのデータを c++ で抽出できるかもしれません (ただし、ここで変換の問題が発生します - 私は 24bgr 形式に集中しています)。

PS: ビットマップ全体をメモリに保持する必要があるため、ビットマップを部分に分割することは解決策ではありません。

PS2: いくつかの問題を明確にするために: ファイル拡張子とファイル形式の違いを知っています。ロードされたファイルは圧縮されていないビットマップで、サイズはピクセルあたり 3 バイトで、サイズは 1.42 GB (16k x 32k ピクセル) ですが、Bitmap オブジェクトが 2 倍以上大きいのはなぜですか? 解凍の問題や他の形式への変換は行われていません。

4

3 に答える 3

1

メモリマップファイルを使用して巨大なデータにアクセスすることを検討してください:)。必要なものに焦点を当てた例をここで見つけることができます: http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx マネージ コードにありますが、同等のネイティブ コードから使用することもできます。 .

詳細が必要な場合はお知らせください。

于 2012-06-16T17:48:00.470 に答える
0

このソリューションを使用できます。C# でビットマップを高速に処理し ます http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

または、メモリマップファイルを使用できます

http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx

于 2013-10-16T11:52:07.610 に答える