2011-03-29 3 views
1

주어진 16 비트 그레이 스케일 값에서 비트 맵을 만들고 싶습니다. 지금까지 나는이 코드를 가지고 :초창기 그레이 스케일 값을 사용하는 잠금 비트

var value = CamData.ToArray(); 

     var b = new Bitmap(160, 112, PixelFormat.Format24bppRgb); 
     var bdata = b.LockBits(new Rectangle(0, 0, 160, 112), ImageLockMode.WriteOnly, b.PixelFormat); 

     unsafe 
     { 
      fixed (ushort* pData = &value[0]) 
      { 
       Marshal.Copy((IntPtr)pData, new IntPtr[]{ bdata.Scan0}, 0, value.Length); 
      } 
     } 
     b.UnlockBits(bdata); 

을하지만 난 Marshal.Copy 메도의 오류 : "요청한 범위는 배열의 끝을 넘어". 오류는 어디에 있습니까?

감사

답변

1

당신은 포인터에 의해 정의 된 메모리 영역에 복사 할 수 없습니다 : 당신은 실제 배열하지 배열에 대한 포인터를 전달해야합니다. 크기가 1 IntPtr 인 배열을 전달하면 작동하지 않습니다.

0

bdata.Scan0은 잠긴 메모리 영역의 시작을 나타내는 IntPtr입니다. 배열로 포장해서는 안됩니다. 그리고 마샬을 사용할 수 있습니다. 소스를 배열로 복사하십시오. 그래서 코드가 될 수있다 :이 this overload of Marshal.Copy를 사용합니다

Marshal.Copy(value, 0, bdata.Scan0, value.Length); 

.

+0

감사합니다.하지만 이제는 보호 된 저택에 쓰려고하는 중 오류가 발생합니다. – h0ppel

+0

왜냐하면 길이 1의 Intptr 배열에 실제로 쓰려고했기 때문에 데이터가 1 ​​(또는 2)보다 길기 때문입니다. – driis