0

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

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

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

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

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

4

1 回答 1

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);
于 2013-05-30T03:16:51.163 回答