2013-01-31 2 views
0

를 사용하여 픽셀 데이터에 액세스 : 보호 된 메모리를 읽거나 쓰려고 시도메모리 오류 세 가지 다른 비트 맵의 ​​픽셀 데이터를 액세스하기 위해 아래의 코드를 사용할 때이 오류를 받고 있어요 LockBits

. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.

C# 코드 :

var bmpDataA = bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
var bmpDataB = bitmap2.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
var bmpDataC = bitmap3.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 

const int width = 1280; 
const int height = 720; 
int npixels = width * height; 

unsafe 
{ 
    int* pPixelsA = (int*)bmpDataA.Scan0.ToPointer(); 
    int* pPixelsB = (int*)bmpDataB.Scan0.ToPointer(); 
    int* pPixelsC = (int*)bmpDataC.Scan0.ToPointer(); 

    for (int i = 0; i < npixels; ++i) 
    { 
     if (pPixelsA[i] == pPixelsB[i]) // <--- Error occurs on this line 
     { 
      pPixelsC[i] = Color.Black.ToArgb(); 
     } 
    } 
} 
bitmap.UnlockBits(bmpDataA); 
bitmap2.UnlockBits(bmpDataB); 
bitmap3.UnlockBits(bmpDataC); 

디버거를 사용하여 나는 오류가 (루프) 변수가 발생했을 때 변수 npixels = 921,600 및 i = 691200. 그래서 확실하지 않은 문제가 무엇 것을 알 수 있습니다 . 픽셀 형식을 32bppRgb로 변경하면 문제가 없으며 정상적으로 작동합니다. 24bppRgb로 작업하고 싶지 않습니다. 어떤 아이디어? 감사. :)

답변

4
  1. PixelFormat.Format24bppRgb 따라서, 각 화소에 24 비트 = 3 바이트를 의미 방법 LockBits 잠금 1,280 * 720 * 3 = 2764800 바이트

  2. 당신은 * int로 고정 된 데이터에 대한 포인터를 캐스팅. int의 크기 = 32 비트 = 4 바이트.

  3. 따라서 1280 * 720 * 4 = 3686400 바이트를 처리하는 반면 2764800은 잠글 수 있습니다 (1 참조). 불일치.