2010-12-30 13 views
3

WPFはメモリの制限によりGDI +ができない大きなビットマップを操作できますか?WPFでの大きなビットマップの作成

私は簡単に10,000x10,000のビットマップを持っていますし、それよりもはるかに大きいかもしれません。最悪の場合私は、単一のビットマップを大きなタイルに分割して、私が推測することができると思う。

は、私は基本的に4つの物事

  1. は黒と白の
  2. スキャンにビットマップを変換する単一のビットマップ
  3. にこれらのタイルのすべてを入れてタイル状の画像のセットを取るを行う必要があります黒から白への変更を探すビットマップ

私はこれらのことをGDI +で行う方法を知っていますが、私は走っています私のビットマップのサイズが私が使用しているマシンにとって大きすぎるため、プログラムがクラッシュし、イメージを小さくすることができないので、WPFがGDI +がある場所で成功することができることを願っています私を失った。

答えて

1

最終的には、タイルを操作するだけで、必要な各タイルの実際の情報を保持する配列を持つことが最善の方法であると判断しました。タイルの数を考えると、私ができる唯一の分かりやすいものでした。

1

私はWPFがあなたをここで助けることができるとは思わない。

なぜビットマップオブジェクトを使用しますか? 1つのチャンネルだけで作業している場合は、2次元配列のバイトまたは2重配列(または、必要な正確さと範囲に応じて他のタイプ)を使用することもできます。ビットマップには、計算コストが膨大なアクセサメソッド(GetPixelなど)があり、配列の操作は、数分の一速く(私は個人的な経験から知っています)、唯一の問題はそれらをそのまま表示することができないことです配列をイメージに戻します。これはかなり簡単です)。しかし、あなたはデータに関する何らかの分析をしたいと思うので、私は配列があなたのニーズにはるかに適していると思います。

必要に応じて、ビットマップ(WPFまたはWinFormsのいずれか)から配列に変換を詳述するコードサンプルを投稿できます。

32ビット.NETアプリケーションでは約1.2-1.4ギガバイトのメモリを使用できることに注意してください。この領域に収まるか、OutOfMemory例外が発生します。

+0

配列への変換では、Lockbitsを使用しますか?私はすでに私の申請の一部でそれをやっています。 –

+0

はい、LockBits for WinFormsを使用して、System.Windows.Media.Imaging.BitmapSourceのCopyPixelsを使用します。 –

0

CommanderZと同様です。そのWindows PRESENTATION Foundationではなく、Windows Image-manipulation Foundationです。 イメージ操作ライブラリのようなものを見つけようとするべきですが、イメージのサイズを見てから、自分ですべてを行うことは唯一の方法かもしれません。

特にビットマップ全体を扱うことはできないので、タイルを扱うことになります。次に、隣接するピクセルで作業する必要がある場合は問題になります。しかし、私はあなた自身でこれを調べなければならないと思います。

関連する問題