2016-10-18 3 views
1

카메라 제조업체의 C# SDK를 사용하고 있습니다.데이터를 복제하지 않고 C# reshape array 1-> 2 D

CaptureImage(struct ExpSettings, ref ushort[] pixelbuffer)

나는 2 차원 배열로 한 차원 배열 pixelbuffer 모양을 변경하려면 : 그들은 방법이있다. 바로 지금 여기에 비슷한 질문으로 Jon Skeet이 제안한대로 Buffer.BlockCopy을 사용하고 있습니다.

그러나 실제 데이터를 복사하지 않고이 작업을 수행하는 방법이 있다면 (C#으로) 생각했습니다. C에서 당신은 예를 들어 노동 조합을 사용할 수 있다고 생각합니다.

어떻게 든 배열 UInt16[,] My2DImageData = new UInt[1000, 1000]을 만든 다음 위의 픽셀 버퍼로 "데이터 배열을 가리 키십시오"?

감사합니다. 친절한 답변/Henrik

+0

왜 당신은 2 차원 배열되고 싶어합니까? 프로그래밍 관점에서 논리적이지 않은 것 같습니다. 너비/높이는 배열 내의 오프셋을 계산하기에 충분합니다. '(offset = (y * width) + x)' –

+0

@JeroenvanLangen 네가 맞다. Image Processing을 할 때 MyImage (y, x) 표기법을 선호하기 때문에 Matlab을 주로 사용했습니다 :-) – Henrik123

답변

4

인덱서를 통해 회원에게 액세스하고 데이터를 복제하지 않으려는 경우 래퍼 클래스를 사용할 수 있습니다.

class ArrayWrapper<T> 
{ 
    private readonly T[] _arr; 
    private readonly int _w, _h; 
    public ArrayWrapper(T[] arr, int w, int h) 
    { 
     if(arr == null) 
      throw new ArgumentNullException("arr"); 

     if(arr.Length != w*h) 
      throw new ArgumentException("Invalid array length", "arr"); 

     _arr = arr; 
     _w = w; 
     _h = h; 
    } 

    public T this[int i, int j] 
    { 
     get { return _arr[i*_w + j]; } 
    } 
} 

var arr = new[] { 
    0, 1, 2, 3, 
    4, 5, 6, 7, 
    8, 9, 10, 11, 
    12, 13, 14, 15 }; 
var wrapper = new ArrayWrapper<int>(arr, 4, 4); 
Console.WriteLine(wrapper[1, 1]); // prints 5 
+0

고마워요! 좋은 솔루션입니다. – Henrik123

+0

MSDN에 대해 간략하게 살펴본 후에 인덱서에 대해 들어 본 적이 없지만 기본적인 아이디어를 얻었습니다. 다시 한 번 감사드립니다! – Henrik123