2013-05-30 11 views
0

구조체 배열을 바이트 배열로 복사하는 데 문제가 있습니다. 구조는 단순한 RGB 구조체입니다. C# 구조체 배열을 Marshal.Copy()를 사용하여 바이트로 복사합니다.

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

은 그 때 나는 내가 LockBits()라고 한 후 Bitmap에 복사 할 주사선을 나타내는 RGBColor[]의 배열을 가지고있다. Marshal.Copy()을 사용하여 byte[] 배열 만 복사 할 수 있습니다.

올바르게 이해한다면 (이해할 수 없다는 것을 명심하십시오) RGBColor[] 배열을 바이트 배열로 마샬링하고, 해당 데이터를 새로운 byte[] 배열에 복사 한 다음 해당 배열을 비트 맵에 복사해야합니다. 그것은 불필요한 복사 작업이 발생하는 것처럼 보입니다. 그리고 나는 중급자로 봉사하는 중간 배열 인 byte[] 배열을 가지고 있습니다.

RGBColor[]byte[]으로 캐스팅 할 수있는 방법이 없으므로 잠긴 비트 맵에 직접 복사 할 수 있습니까?

답변

1

Marshal.Copy()는이 경우 올바른 방법이 아니므로 바이트 []를 기분 전환해야합니다. 여러 가지 방법으로 상처를받습니다. 정말 필요한 것은 IntPtr에서 IntPtr로 복사하여 배열을 고정하면 작업이 완료되고 복사본과 구조 레이아웃이 번거로워지는 것을 방지 할 수 있습니다. .NET 프레임 워크에는 .NET Framework가 없습니다.

하지만 Windows에서는 memcpy() 기능을 pinvoke 할 수 있습니다. 선언을 수정하여 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); 
+0

'보폭'이 양수인 모든 경우에 좋을 것 같습니다. –

+0

Win32 API에 대해 잘 알고 있습니다. .NET 언어로 이런 식으로 사용할 수 있다는 것을 알지 못했습니다. 이 지시어 가져 오기가 Linux의 Mono에서 올바르게 작동하는지 알고 있습니까? – user2434792