2013-05-30 159 views
0

我有一個複製結構數組作爲字節數組的問題。結構是簡單的RGB結構。c#使用Marshal.Copy複製結構的數組作爲字節()

public struct RGBColor { byte r; byte g; byte b; } 

然後我有RGBColor[]數組,表示我想複製到Bitmap我叫LockBits()後掃描線。它只會允許使用Marshal.Copy()複製byte[]的數組。

如果我理解正確(請記住我不明白),我需要將RGBColor[]陣列編組爲一個字節數組,將數據複製到新的byte[]數組,然後將該數組複製到位圖。似乎有一個不必要的複製操作發生,我有一箇中間byte[]陣列只是作爲一箇中間人。

難道我沒有辦法將RGBColor[]轉換成byte[],所以我可以直接將它複製到鎖定的位圖上?

回答

1

Marshal.Copy()在這種情況下不是正確的方法,它迫使你咳嗽byte [],並且以多種方式傷害。你真正需要的是一種從IntPtr複製到IntPtr的方法,這樣只需釘住數組即可完成工作,避免了複製和結構佈局的麻煩。 .NET框架沒有一個。

但是Windows不支持,你可以調用memcpy()函數。你可以修改聲明使其接受你的RGBColor []數組。像這樣:

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static extern int memcpy(IntPtr dest, RGBColor[] srce, int bytes); 

第一個參數有點棘手。您需要:

BitmapData bd = ... 
    IntPtr dest = new IntPtr((long)bd.Scan0 + scanline * bd.Stride); 
+0

對於「步幅」爲正值的所有情況都很適合。 –

+0

我熟悉Win32 API的。從來不知道我可以用.NET語言以這種方式使用它們。你知道這些指令導入可以在Linux上的Mono上正常工作嗎? – user2434792

相關問題