2012-02-02 75 views
2

我有一個C緩衝區(uint8 [] BGR像素數據)在C持有視頻幀。指向此緩衝區的指針作爲IntPtr由C代碼傳遞迴C#代碼。我需要爲每個幀添加文本覆蓋,然後將指針傳遞給幀以供進一步處理。我相信我需要做的(用C#)是將每一幀複製到一個位圖對象,獲取位圖的設備上下文,然後使用TextOut(等)將文本寫入位圖。然後我會將修改的位圖幀數據複製回原始數組。C緩衝區C#位圖對象

我的問題是雙重的:

  1. 這是最好的方法?
  2. 什麼是將數據從我的IntPtr複製到位圖對象的最佳(最快)方法。

謝謝。

+0

我寧願在C++/CLI中創建一個類,並在我的C#代碼中使用它,而不是使用DllImports來玩!如果您有興趣,請參閱http://stackoverflow.com/questions/2211867/how-do-i-call-native-c-from-c – MetallicPriest 2012-02-02 11:05:47

回答

2

的最快方式是通過不復制次e數據。這要求您的數據採用支持的像素格式,BGR聽起來有點可怕,但機率很高,實際上是PixelFormat.Format24bppRgb。

然後允許您使用Bitmap(int, int, int, PixelFormat, IntPtr constructor)

+0

嗨使用這個和它的工作正常。我的格式是24bpp,typedef的結果是我的源代碼是RGB(而不是BGR,就像代碼中的枚舉所說的那樣!)。謝謝。 – integra753 2012-02-02 14:26:25

2

,我不能對你的做法發表評論,但複製使用兩個指針數據的最快方法是做一個平臺調用調用memcpy功能MSVCRT.DLL下面

代碼示例,取自WriteableBitmapEx source

internal static class NativeMethods 
{ 
    internal static unsafe void CopyUnmanagedMemory(byte* srcPtr, int srcOffset, 
             byte* dstPtr, int dstOffset, int count) 
    { 
     srcPtr += srcOffset; 
     dstPtr += dstOffset; 

     memcpy(dstPtr, srcPtr, count); 
    } 

    // Win32 memory copy function 
    [DllImport("msvcrt.dll", EntryPoint = "memcpy", 
      CallingConvention = CallingConvention.Cdecl, SetLastError = false)] 
    private static extern unsafe byte* memcpy(byte* dst, byte* src, int count); 
} 

要轉換一個IntPtr到*字節而使用

unsafe 
{ 
    IntPtr myPtr; 
    byte* bytePtr = (byte*)myPtr.ToPointer(); 
} 
+0

使用C++/CLI作爲膠水不是更好嗎?儘管在.NET工作了很長一段時間,但我記得曾經在C++/CLI上做過一個類,然後直接在C#中使用它,而不是在醜陋的dllimport中玩耍。我會說更簡單的方法。 – MetallicPriest 2012-02-02 11:04:31

+0

是的,您也可以這樣做 - 取決於您是否有權訪問C源代碼以在其中插入C++/CLI,或者需要創建另一個DLL。我會說,如果你需要做的只是一個memcpy,那麼C++/CLI是矯枉過正的。但它對於更復雜的互操作非常有用 – 2012-02-02 11:07:47

+0

使用其他解決方案,但我會記住這一點以供將來參考。謝謝。 – integra753 2012-02-02 14:27:37