c#使用Marshal.Copy()将结构数组复制为字节

时间:2013-05-30 02:43:17

标签: c# bitmap marshalling lockbits

我将结构数组复制为字节数组时遇到问题。结构是简单的RGB结构。

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

然后我有一个RGBColor[]数组,代表我在调用Bitmap后要复制到LockBits()的扫描线。它只允许使用byte[]复制Marshal.Copy()数组。

如果我理解正确(请记住我不理解),我需要将RGBColor[]数组封送到一个字节数组,将数据复制到新的byte[]数组,然后复制数组到位图。似乎有一个不必要的复制操作发生,我有一个中间byte[]数组只是作为一个中间人。

我有没有办法将RGBColor[]转换为byte[]所以我可以直接将其复制到锁定的位图?

1 个答案:

答案 0 :(得分: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);