2010-02-10 2 views
3

부록을 쓰려고 시도 : 내가 "코드를 최적화"의 선택을 취소하면 제대로 실행 것으로 보인다 날이 C#을 보호 된 메모리를 읽거나 오류

은 첫째로 내가 관리되지 않는 코드를 실행하려고 몇 가지 기발한 구성 문제라고 생각에 이르게한다. "안전하지 않은 코드 허용"을 선택했습니다. 내가 상대적으로 느린 getPixel와를 사용하지 않고 비트 맵을 읽기 위해 노력하고 여기에 코드 줄을 가리키는 :

byte[] buff = { scanline[xo], scanline[xo + 1], scanline[xo + 2], 0xff }; 

전체 조각은 다음과 같습니다. 이 문제를 어떻게 해결할 수 있습니까?

private const int PIXELSIZE = 4;    // Number of bytes in a pixel 

BitmapData mainImageData = mainImage.LockBits(new Rectangle(0, 0, mainImage.Width, mainImage.Height), ImageLockMode.ReadOnly, mainImage.PixelFormat); 
List<Point> results = new List<Point>(); 

foundRects = new List<Rectangle>(); 

for (int y = 0; y < mainImageData.Height 
{ 
     byte* scanline = (byte*)mainImageData.Scan0 + (y * mainImageData.Stride); 

     for (int x = 0; x < mainImageData.Width; x++) 
     { 
      int xo = x * PIXELSIZE; 
      byte[] buff = { scanline[xo], scanline[xo + 1], 
        scanline[xo + 2], 0xff }; 
      int val = BitConverter.ToInt32(buff, 0); 

      // Pixle value from subimage in desktop image 
      if (pixels.ContainsKey(val) && NotFound(x, y)) 
      { 
       Point loc = (Point)pixels[val]; 

       int sx = x - loc.X; 
       int sy = y - loc.Y; 
       // Subimage occurs in desktop image 
       if (ImageThere(mainImageData, subImage, sx, sy)) 
       { 
        Point p = new Point(x - loc.X, y - loc.Y); 
        results.Add(p); 
        foundRects.Add(new Rectangle(x, y, subImage.Width, 
                   subImage.Height)); 
       } 
      } 
     } 
+0

무엇이 PIXELSIZE 값입니까? –

+1

이미지의 형식이 32bppRGB입니까? 코드에서 픽셀 형식을 지정하거나 확인하지 마십시오. –

+0

또한, 루프 앞에 한 번 포인터를 Scan0으로 설정 한 다음 PIXELSIZE로 내부 루프 내부에서 증가시킵니다. –

답변

3

그것은 우리가 가진 제한된 정보로 말을하기 어렵다, 그러나 나는 직접 문제를 해결 하나의 명백한 문제의 몇 가지 참조 :

  1. 당신은 픽셀 형식을 확인하지 않는, 그러나 가정합니다 그것은 32bppRGB입니다. 그것은 24bppRGB 일 가능성이 있으며 오류를 설명합니다.

  2. RGB 값을 잘못 읽었습니다. Windows는 내부적으로 비트 맵을 BGR 순서로 저장합니다.

  3. 메서드가 끝날 때 UnlockBits를 호출하지 않습니다.

0

x가 mainImageData.Width - 1 인 경우 xo + 1 및 xo + 2 값은 무엇입니까? 그들은 분명히 예약을 취소하고 있습니다.

+0

아니요, 괜찮습니다. x는 픽셀이지만 xo는 바이트입니다. –

0

가장 큰 이유는 이미지가 32bpp가 아니라는 것입니다. 24bpp, 또는 8 또는 16 비트 일 수 있습니다.

당신은 당신이 걸음을 위해 점점 값이 폭에 동의 있는지 4.

확인에 하드 코딩보다 오히려 PixelFormat에서 PIXELSIZE을 받고해야한다.

관련 문제