문제

이것은 다음과 같은 답이없는 질문의 반복 일 수 있습니다.

 비트 맵 잠금 장치 - 형식 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).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top