[英]c# copy array of structures as bytes using Marshal.Copy()
我在將結構數組復制為字節數組時遇到問題。 結構是簡單的RGB結構。
public struct RGBColor { byte r; byte g; byte b; }
然后,我有一個RGBColor[]
數組,它表示要在調用LockBits()
之后復制LockBits()
Bitmap
的掃描線。 它僅允許使用Marshal.Copy()
復制byte[]
數組。
如果我理解正確(請記住我不要理解),則需要將RGBColor[]
數組編組為字節數組,將數據復制到新的byte[]
數組,然后將該數組復制到位圖。 似乎正在發生不必要的復制操作,並且我有一個中間的byte[]
數組僅用作中間人。
有什么方法可以將RGBColor[]
為byte[]
以便直接將其復制到鎖定的位圖嗎?
在這種情況下,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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.