2017-05-22 1 views
0

RGBA 값을 2 32bpp 이미지 (내 경우 1920X1080) 보유하고 2 비트 배열을 비교하고 비트에 일부 작업을 수행합니다 (질문과 관련이 없음) .포인터를 통해 비트 맵 픽셀 처리

첫 번째 원하는 픽셀에 대한 포인터 을 사용하여 한 번에 4 바이트를 비교합니다.

이 내 코드입니다 :

private unsafe void Process(byte[] prev, byte[] curr, Rectangle rect) 
{ 

fixed (byte* image1BasePtr = prev, image2BasePtr = curr) 
{ 
    int offset = (rect.Y * mainBmp.Width) + rect.X; 

    int* prevPtr = (int*)image1BasePtr; 
    prevPtr += offset; 
    int* currPtr = (int*)image2BasePtr; 
    currPtr += offset; 

    int toY = rect.Y + rect.Height; 
    int toX = rect.X + rect.Width; 
    for (int y = rect.Y; y < toY; y++) 
    { 

     for (int x = rect.X; x < toX; x++) 
     { 

      if (currPtr[x] != prevPtr[x]) // Compare 4 bytes at once. 
      { 
       //Here i do somthing..doesn't really matter what 

      } 

     } 
     prevPtr += mainBmp.Width; // Advance pointers to the next line. 
     currPtr += mainBmp.Width;// Advance pointers to the next line. 

    } 
    } 
} 

내가 전체 이미지를 처리하지 않으려면, 처리하기 위해 특정 영역을 선택할 수 있습니다.

는 (예를 들어) 호인이 경우

Process(rgbprev, rgbcurr, new Rectangle(1000, 0, 920, 1080)); 

주사 비트 맵 (제 경우 1920)의 단부에, 1000의 픽셀에서 시작하고, 제 1의 것 마지막 줄까지 줄 (Y=0). 내가 y=1079 and x=1630에 내가 할 코드와 예외를 실행하면

는 :

은 보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.

내 포인터 논리가 잘못되었다고 생각합니다 ....하지만 찾을 수 없습니다.

누구나 여기서 문제를 볼 수 있습니까?

미리 감사드립니다.

답변

0

문제는 첫 번째 오프셋에 단지 + rect.X 인 것 같습니다.

두 번째 for 루프에서 rect.X부터 시작하므로 처음으로 추가 할 필요가 없습니다.

+0

나는 또한 이렇게 생각했다. 그러나 오프셋에서'rect.X'를 제거하면 ...'if' 조건은 결코 사실이 아니며 (** ** 이미지에 몇 가지 다른 픽셀이 있습니다. 나는 내 눈에서 본다.) ... – Slashy

+0

나의 잘못 ... 그것은 정말로 일한다! 감사 – Slashy

관련 문제