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
에 내가 할 코드와 예외를 실행하면
는 :
은 보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.
내 포인터 논리가 잘못되었다고 생각합니다 ....하지만 찾을 수 없습니다.
누구나 여기서 문제를 볼 수 있습니까?
미리 감사드립니다.
나는 또한 이렇게 생각했다. 그러나 오프셋에서'rect.X'를 제거하면 ...'if' 조건은 결코 사실이 아니며 (** ** 이미지에 몇 가지 다른 픽셀이 있습니다. 나는 내 눈에서 본다.) ... – Slashy
나의 잘못 ... 그것은 정말로 일한다! 감사 – Slashy