我将结构数组复制为字节数组时遇到问题。结构是简单的RGB结构。
public struct RGBColor { byte r; byte g; byte b; }
然后我有一个RGBColor[]
数组,代表我在调用Bitmap
后要复制到LockBits()
的扫描线。它只允许使用byte[]
复制Marshal.Copy()
数组。
如果我理解正确(请记住我不理解),我需要将RGBColor[]
数组封送到一个字节数组,将数据复制到新的byte[]
数组,然后复制数组到位图。似乎有一个不必要的复制操作发生,我有一个中间byte[]
数组只是作为一个中间人。
我有没有办法将RGBColor[]
转换为byte[]
所以我可以直接将其复制到锁定的位图?
答案 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);