2009-07-02 6 views
1

이 다음과 같은 답이없는 질문의 반복이 될 수 있습니다잠금 포인터는 C# 비트 맵의 ​​사각형을 잠글 때

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는 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. 

보폭은 704입니다, 내 소프트웨어의 논리가 정확한 포인터 중간 창으로 위치, 그래서 모든 것을 함께 제공 : 수동으로 중간 창에 픽셀을 얻기 위해 수학에 입력하여, 나는 다음과 같은 수 좋아 보인다. 290-320의 Y 픽셀은 역 참조 할 수 있습니다. 대신 전체 비트 맵을 잠그면 모든 논리가 잘 진행되지만 올바른 픽셀을 얻는 지 또는 LockBits에서 잠금 사각형을 사용하는 방법에 대한 의문이 생깁니다.

필요한 영역 만 잠글 때 BitmapData에서 예상되는 잠긴 픽셀에 액세스 할 수없는 이유는 무엇입니까?

답변

3

는 오프셋과 사각형을 사용하여 비트를 잠그면, 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)이됩니다.

+0

나는 이것이 사실일지도 모른다고 생각하고 게시하기 전에 MSDN에 대해이 사실을 알기는했지만 절대로 발견하지 못했습니다. 감사. –

관련 문제