2012-11-16 5 views
0

나는 카메라와 계약을 맺고이 dll 안에 3D 바이트 배열에 비디오 프레임을 저장하는 델파이 dll을 가지고있다. rgb 형식을 구현하려면 3D 차원이 필요하며 dll 배경에 편리합니다 (개발자가 말했듯이). 그래서 C# 코드에서 배열에 액세스하고 Bitmap을 만들고 내용을 표시해야합니다. 하지만 배열 요소를 제대로 액세스하는 방법을 이해하지 못합니다. 코드 줄은 오류가 발생했습니다C에서 델파이 dll 내부에 관리되지 않는 배열에 액세스 #

private unsafe void ByteArray2Bitmap(IntPrt data, int width, int height, int depth, out Bitmap bmp) 
    {    
     // create a bitmap and manipulate it 
     bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
     BitmapData bits = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bmp.PixelFormat); 

     fixed(byte*** data = (byte***)(m_data.ToPointer())) 
     { 
      for (int i = 0; i < height; i++) 
      { 
       int* row = (int*)((byte*)bits.Scan0 + (i * bits.Stride)); 
       for (int j = 0; j < width; j++) 
       { 
        int pixel = BitConverter.ToInt32(&data[i][j][0], 0); 
        row[j] = pixel; 
       } 
      } 
     } 
     bmp.UnlockBits(bits); 
    } 

: 여기 내 코드 고정 문 할당의 오른쪽이

fixed(byte*** data = (byte***)(m_data.ToPointer())) 

가되어 주조 식 멀티 dimentional에 액세스 할 수있는 방법하지 않을 수 있습니다 마샬 복사로 복사하지 않고 관리되지 않는 배열?

답변

0

코드가 다소 혼란 스럽습니다. 메서드에 data 매개 변수가 있고 fixed 문을 사용하여 data 변수를 만들려고합니다. 아마도 매개 변수는 m_data일까요?

어쨌든 m_data.ToPointer()은 이미 고정 주소를 제공하므로 다시 고칠 필요가 없습니다. 다음과 같이 쓸 수 있어야합니다 :

byte*** data = (byte***)(m_data.ToPointer()); 

정확히 무엇을하려고하는지 명확하지 않습니다. 그래도 pixel 변수가 대신 byte이되도록하고 싶습니다. 그렇지 않으면 비트 데이터의 끝을 쓸 때 액세스 예외가 발생합니다.

+0

힌트를 보내 주셔서 감사합니다. 아마, 나는 하루의 끝에서 너무 피곤했다. 두 번째 부분에서는 rgb 색상 (byte [i] [j] [0] - r, byte [i] [j] [1] -g, [i])을 나타내므로 바이트의 3 차원을 액세스하려고합니다. ] [j] [2] - b). 그래서, 바이트 배열을 int (비트 맵 픽셀)로 변환해야합니다. – ilja