我有一個C緩衝區(uint8 [] BGR像素數據)在C持有視頻幀。指向此緩衝區的指針作爲IntPtr由C代碼傳遞迴C#代碼。我需要爲每個幀添加文本覆蓋,然後將指針傳遞給幀以供進一步處理。我相信我需要做的(用C#)是將每一幀複製到一個位圖對象,獲取位圖的設備上下文,然後使用TextOut(等)將文本寫入位圖。然後我會將修改的位圖幀數據複製回原始數組。C緩衝區C#位圖對象
我的問題是雙重的:
- 這是最好的方法?
- 什麼是將數據從我的IntPtr複製到位圖對象的最佳(最快)方法。
謝謝。
我有一個C緩衝區(uint8 [] BGR像素數據)在C持有視頻幀。指向此緩衝區的指針作爲IntPtr由C代碼傳遞迴C#代碼。我需要爲每個幀添加文本覆蓋,然後將指針傳遞給幀以供進一步處理。我相信我需要做的(用C#)是將每一幀複製到一個位圖對象,獲取位圖的設備上下文,然後使用TextOut(等)將文本寫入位圖。然後我會將修改的位圖幀數據複製回原始數組。C緩衝區C#位圖對象
我的問題是雙重的:
謝謝。
的最快方式是通過不復制次e數據。這要求您的數據採用支持的像素格式,BGR聽起來有點可怕,但機率很高,實際上是PixelFormat.Format24bppRgb。
然後允許您使用Bitmap(int, int, int, PixelFormat, IntPtr constructor)。
嗨使用這個和它的工作正常。我的格式是24bpp,typedef的結果是我的源代碼是RGB(而不是BGR,就像代碼中的枚舉所說的那樣!)。謝謝。 – integra753 2012-02-02 14:26:25
,我不能對你的做法發表評論,但複製使用兩個指針數據的最快方法是做一個平臺調用調用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();
}
使用C++/CLI作爲膠水不是更好嗎?儘管在.NET工作了很長一段時間,但我記得曾經在C++/CLI上做過一個類,然後直接在C#中使用它,而不是在醜陋的dllimport中玩耍。我會說更簡單的方法。 – MetallicPriest 2012-02-02 11:04:31
是的,您也可以這樣做 - 取決於您是否有權訪問C源代碼以在其中插入C++/CLI,或者需要創建另一個DLL。我會說,如果你需要做的只是一個memcpy,那麼C++/CLI是矯枉過正的。但它對於更復雜的互操作非常有用 – 2012-02-02 11:07:47
使用其他解決方案,但我會記住這一點以供將來參考。謝謝。 – integra753 2012-02-02 14:27:37
我寧願在C++/CLI中創建一個類,並在我的C#代碼中使用它,而不是使用DllImports來玩!如果您有興趣,請參閱http://stackoverflow.com/questions/2211867/how-do-i-call-native-c-from-c – MetallicPriest 2012-02-02 11:05:47