C#のビットマップ内の矩形をロックロックポインタ
-
21-08-2019 - |
質問
これは、次の未回答の質問の繰り返しかもしれます:
Help with bitmap lock - Format8bppIndexed
私は次のようにイメージをロックしています:
// PixelFormat is 8BppIndexed in my case.
Bitmap bmp = new Bitmap("mySampleImage.tif");
// ClipRectangle will be a Rectangle such as {x=128, y=290, width=250, height=200},
// selected by the user by seeing the image on screen. Thus, it's a valid region
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);
unsafe
{
byte* origin = (byte*)data.Scan0.ToPointer();
// Processing...
}
処理部で、Iは、Y方向にClipRectangleの画素をステップ。しかし、ピクセルが言って、メモリアクセスエラーと有効なリターンされるべきであると私はできないポインタデリファレンスています。
たとえば、使用704x600画像における
ClipRectangle = {x=128, y=290, width=250, height=200}
ピクセル(128x321)
は、有効にする必要があります。手動で中間ウィンドウでそのピクセルを取得するために数学を入力して、私は次の取得ます:
origin + (321 * stride) + 128 0x053a80c0 *(origin + (321 * stride) + 128): Cannot dereference 'origin + (321 * stride) + 128'. The pointer is not valid.
ストライドは、私のソフトウェアにおけるロジックは、中間ウィンドウとして正確なポインタの位置を思い付く、そのすべてが右のようで、704です。 290-320からのYピクセルはうまく逆参照することができます。私が代わりにビットマップ全体をロックした場合は、すべての私のロジックは細かい進行するが、私は右のピクセルを得ている、またはロック矩形がするLockBitsで使用されているかかどうかについて疑問を持っています。
の私は私が必要とする領域のみをロックしたときに、なぜ私がBitmapDataに期待されるロックされたピクセルにアクセスすることはできません?の
解決
あなたが持つ矩形を使用してビットをロックするとオフセット、BitmapData.Scan0
は戻りません。のビットマップの起源ではなく、指定した矩形の起源ます。
だから、あなたが使用している場合:
Rectangle rect = new Rectangle(128, 290, 250, 200);
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);
次にScan0
から最大オフセットは(250 * Stride) + 200
ある。
言い換えれば、(128x321)の画素は(Scan0 + (321 - 290) * Stride)
であろう。
所属していません StackOverflow