【问题标题】:c# copy array of structures as bytes using Marshal.Copy()c# 使用 Marshal.Copy() 将结构数组复制为字节
【发布时间】:2013-05-30 02:43:16
【问题描述】:

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

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

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

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

有没有什么办法可以将RGBColor[] 转换为byte[],这样我就可以直接将其复制到锁定的位图上?

【问题讨论】:

    标签: c# bitmap marshalling lockbits


    【解决方案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);
    

    【讨论】:

    • 我熟悉 Win32 API。从来不知道我可以在 .NET 语言中以这种方式使用它们。你知道这些指令导入是否会在 Linux 上的 Mono 中正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2011-10-04
    • 2016-12-09
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多