1

BitmapImageC# ポインターを使用してオブジェクトの基になるメモリにアクセスする方法はありますか?

メソッドがあることは知っていCopyPixelsますが、ピクセル配列のコピーを新しい配列に作成します(メモリ要件が重複しています)。大きな画像 (2 GB) を開くと、多くの役に立たないものが割り当てられます。また、CCLA のようなある種の精緻化を実行したい場合は、膨大な量のメモリが必要です。

ピクセル配列を読み取るだけです。

でできるように、ピクセルを直接アドレス指定することは可能System.Drawing.Bitmapですか?

の高速ビットマップ アクセスを作成しましSystem.Drawing.Bitmapたが、WPF を使用しているため、 にも同じ機能が必要ですBitmapSource。それ以外の場合は、イメージの読み込みを複製する必要があります (古い方法のビットマップとBitmapSourceWPF でイメージを表示する) には、多くのメモリと時間がかかります。

ありがとうロレンツォ

4

1 に答える 1

2

ビットマップ ソースには、必ずしもイメージ全体のバッキング メモリがあるとは限りません。遅延ロードされたディスク上の画像ファイルがそうでない場合の例です。

WIC (したがって WPF) でアクセスできる唯一のアクセスはCopyPixelsメソッドです。の特定のサブクラスはBitmapSourceバッファへのアクセスを許可しますが、内部的にメモリを割り当ててCopyPixels自分自身を呼び出すだけです。

どのような操作でも、一度にイメージ全体にアクセスする必要はないと思います。その場合はCopyPixels、より小さいバッファーを呼び出して、イメージへのアクセスをウィンドウ化できます。ほとんどのデコーダは、1 つのピクセルが要求されると、ストライド全体をバッファリングします。JPEG の場合はブロック全体をバッファリングします。

CCLA が何であるかはわかりませんし、適合すると思われる定義を見つけることもできませんが、ソース イメージの何らかの変換である場合は、BitmapSource. そうすれば、完全なチェーンを構成できます。

ソース イメージで使用されている と変換の順序に細心の注意を払うことで、CacheOptionメモリに大きな影響を与えることなく、任意のサイズのイメージにアクセスできるはずです。

GDI ( ) のパフォーマンスの高いアルゴリズムが既にある場合はSystem.Drawing、それを再実装しても意味がありません。Imaging.CreateBitmapSourceFromHBitmapを使用するか、WindowsFormsHost以前に作成したコントロールをホストするためにを使用することで、最終的なビットマップを引き続き表示できます。

于 2014-01-26T17:16:53.230 に答える