1

ピクセルデータの読み取りと書き込みをすばやく行うために、を使用して取得したBitmapDataオブジェクトを使用しています。Bitmap.LockBits機能はクラスにカプセル化されています。Scan0オブジェクトのとへStrideの参照を保存できBitmapDataますか、それともピクセルにアクセスする必要があるたびにそれを読み取る必要がありますか?私の使用法に基づいて、同じクラスオブジェクトを何時間もアクティブにすることができますが、この期間中にScan0/はStride変更されますか?または、プロパティへのアクセスを減らすために、それらへの参照をクラスに格納できますか?

毎回アクセスする(少し遅い)

public BitmapData Data;

byte* pixByte = (byte*)BmpData.Scan0 + (Y * BmpData.Stride) + (X * 3); // access pixel of 24bpp image

参照の保存(これは可能ですか?)

public BitmapData Data;
public IntPtr Scan0;
public int Stride;

byte* pixByte = (byte*)Scan0 + (Y * Stride) + (X * 3); // access pixel of 24bpp image
4

2 に答える 2

2

いいえ、ビットマップのピクセルデータはアンマネージメモリに保存されます。これが、BitmapData.Scan0のタイプがIntPtrである理由です。アンマネージポインターはその値を変更することはありません。アンマネージヒープマネージャーのガベージコレクターを圧縮することに相当するものはありません。

ただし、これはビットマップがロックされている場合にのみ有効です。一般に、Bitmap.UnlockBits()をすばやく呼び出すことが重要です。ロックが有効になっている間は、ビットマップオブジェクトは使用できません。ビットマップをペイントするようなことをしようとすると、ビットマップがロックされている間は例外が発生して失敗します。したがって、後で使用するためにScan0ポインタを保存することは、ほとんどの場合、間違ったことです。

于 2013-03-08T15:21:52.500 に答える
0

BitmapData(したがって)への参照は、開いScan0ている間のみ有効でありBitmap.Lockbits、一度呼び出すUnlockBitsとポインタは無効になります。

その値を効果的にキャッシュすることはできませんが、ビットマップの色深度とサイズが変更されないことがわかっている場合は、ルックアップテーブルを事前に計算して、ストライド(行)とピクセルのサイズ(24bppの色深度の場合は3バイト)。これらは基本的に静的です。

于 2013-03-08T14:33:39.810 に答える