簡體   English   中英

c#使用Marshal.Copy()將結構數組復制為字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM