2010-04-01 126 views
3

我有一个Dallmeier相机设备的工作包装类,它包含一个回调方法来接收当前的YUV图像。
查看详细信息C# wrapper for array of three pointers正确使用Marshal.Copy

我的窗体上有一个按钮,它获取YUV图像。回调函数返回'yuvData',这是一个包含三个指向Y,U和V部分图像指针的数组。 然后,我将三个指针复制到他们自己的指针中,然后将它们复制到一个字节数组中。 yuvCallback继续运行,直到断开相机。

我是否正确使用Marshal.Copy?

public class DLMSDK 
{ 
    public delegate int YUVDataCallback(dlm_yuvdataParametersStructure pParameters); 

    DllImport(@"DallmeiersDLL\davidapileolive.dll")] 
     public extern static int dlm_setYUVDataCallback(int SessionHandle, YUVDataCallback dataCallback); 

     [StructLayout(LayoutKind.Explicit, Size = 32)] 
     public struct dlm_yuvdataParametersStructure 
     { 
      [FieldOffset(0)] 
      public int IPlayerID; 
      [FieldOffset(4), MarshalAs(UnmanagedType.ByValArray, SizeConst=3)] 
      public IntPtr[] yuvData; 
      [FieldOffset(8), MarshalAs(UnmanagedType.ByValArray, SizeConst=1)] 
      public IntPtr[] pitch; 
      [FieldOffset(12)] 
      public int width; 
      [FieldOffset(16)] 
      public int height; 
      [FieldOffset(18)] 
      public long ts; 
      [FieldOffset(28), MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] 
      public IntPtr[] extData; 
     } 
} 

public partical class Form1 : Form 
{ 
    int width; int height; 
    int yArraySize; int uvArraySize; 
    byte[] yBytes; byte[] uBytes; byte[] vBytes; 
    int sizeY; int sizeU; int sizeV; 
    IntPtr ptrY; IntPtr ptrU; IntPtr ptrV; 

    DLMSDK.YuvDataCallback yuvdataCallback; 

    private void Form1_Load(object send, EventArgs e) 
    { 
     error = DLMSDK.dlm_initSDK(); 
     if (error == 0) 
      registerEvents(); 
    } 

    private void registerEVents() 
    { 
     yuvdataCallback = yuvdataHandler; 
    } 

    private void btnGetYUV_Click(object sender, EventArgs e) 
    { 
     try 
     { 
       error = DLMSDK.dlm_setYUVDataCallback(SessionHandle, yuvdataCallback);  
     } 
     catch (Exception ex) 
     { 
       MessageBox.Show(ex.ToString()); 
     } 
    } 

    public int yuvdataHandler(DLMSDK.dlm_yuvdataParametersStructure pParameters) 
    { 
     width = pParameters.width; 
     height = pParameters.height; 
     yArraySize = width * height; 
     uvArraySize = yArraySize/4; 

     yBytes = new byte[yArraySize]; 
     uBytes = new byte[uvArraySize]; 
     vBytes = new byte[uvArraySize]; 

     sizeY = Marshal.SizeOf(yBytes[0]) * yBytes.Length; 
     ptrY = Marshal.AllocHGlobal(sizeY); 

     sizeU = Marshal.SizeOf(uBytes[0]) * uBytes.Length; 
     ptrU = Marshal.AllocHGlobal(sizeU); 

     sizeV = Marshal.SizeOf(vBytes[0]) * vBytes.Length; 
     ptrV = Marshal.AllocHGlobal(sizeV); 

     try 
     { 
      // Copy the three pointers to Y,U, & V pointers 
      Marshal.Copy(pParameters.yuvData, 0, ptrY, 1); 
      Marshal.Copy(pParameters.yuvData, 1, ptrU, 1); 
      Marshal.Copy(pParameters.yuvData, 2, ptrV, 1); 

      // Copy pointers to YUV byte arrays 
      Marshal.Copy(ptrY, yBytes, 0, sizeY); 
      Marshal.Copy(ptrU, uBytes, 0, sizeU); 
      Marshal.Copy(ptrV, vBytes, 0, sizeV); 

      // Convert Y (Luminance) to Greyscale and display 
      Bitmap bmp = ImgConvert.ToGreyscale(yBytes, width, height); 
      DisplayImage(bmp); 
     } 
     finally 
     { 
      if (ptrY != IntPtr.Zero) 
      { 
       Marshal.FreeHGlobal(ptrY); 
       ptrY = IntPtr.Zero; 
      } 
      if (ptrU != IntPtr.Zero) 
      { 
       Marshal.FreeHGlobal(ptrU); 
       ptrU = IntPtr.Zero; 
      } 
      if (ptrV != IntPtr.Zero) 
      { 
       Marshal.FreeHGlobal(ptrV); 
       ptrV = IntPtr.Zero; 
      } 
     } 

     return 0; 
    } 
} 

回答