C# 비트 맵에서 사각형을 잠글 때 잠긴 포인터
-
21-08-2019 - |
문제
이것은 다음과 같은 답이없는 질문의 반복 일 수 있습니다.
비트 맵 잠금 장치 - 형식 8bppindexed
다음과 같은 방식으로 이미지를 잠그고 있습니다.
// 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...
}
처리 섹션에서, 나는 cliprectangle의 y 방향으로 픽셀을 밟습니다. 그러나 유효한 픽셀은 메모리 액세스 오류로 반환하여 포인터를 피할 수 없다고 말합니다.
예를 들어, 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.
Stride는 704이며, 내 소프트웨어의 논리는 중간 창으로 정확한 포인터 위치를 제시하므로 모든 것이 올바르게 보입니다. 290-320의 y 픽셀은 잘 알려질 수 있습니다. 대신 전체 비트 맵을 잠그면 모든 논리가 잘 진행되지만 올바른 픽셀을 얻는 지 또는 잠금 사각형이 Lockbits에서 어떻게 사용되는지에 대한 의문이 있습니다.
필요한 영역 만 잠글 때 비트 맵타타에서 예상 잠긴 픽셀에 액세스 할 수없는 이유는 무엇입니까?
해결책
오프셋이있는 사각형을 사용하여 비트를 잠그면 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