Hallo,
ich bekomme über eine COM-Funktion einen Pointer auf ein Byte-Array, also in C++-Syntax, ein BYTE**. In der C#-Repräsentation (also über die Wrapper-Lib) bekomme ich diesen Pointer als IntPtr. Ich möchte dieses in ein C#-byte[] umwandeln, würde also so etwas machen:
int hr;
IntPtr buffer_ptr;
byte[] my_array = new byte[array_size];
hr = vmr_control.GetCurrentImage(out buffer_ptr); // COM call returning buffer_ptr
// hr check...nicht wichtig - übersprungen
Marshal.Copy(buffer_ptr, my_array, 0, array_size);
Jetzt enthält dieses Byte-Array (wie das Snippet schon verrät) Bilddaten, die ich umordnen muss - nämlich das ganze Bild auf den Kopf stellen und Grün- und Blaukanäle tauschen. Um das zu erreichen, müsste ich mir nun _noch _eine Kopie des Arrays anlegen und beim Kopieren eben entsprechend verfahren. Darunter leidet natürlich die Performance, und da es dabei um das Abspielen eines Videos geht wäre das sehr schlecht.
Meine Frage: Kann ich Marhshal.Copy irgendwie "customizen", sodass ich bestimmen kann, _wie _die Daten in das byte[] kopiert werden?
Schau Dir mal den Artikel Gewusst wie: Verwenden von Zeigern zum Kopieren eines Bytearrays (C#-Programmierhandbuch) über direkte Pointerarithmetik als unsafe code an - ich denke, dass Du entweder eine C++/CLI oder darueber vorgehen musst, um entsprechend schnellen Code zu schreiben.
Edit - zum Umdrehen wirst Du wahrscheinlich mit Array.Reverse arbeiten koennen - das sollte auch sehr schnell sein.
Ist unter x64 deutlich effizienter.
Unter x84 solltest du auf die üblichen Mittel zurückgreifen.
Sehr cool - werde ich mal austesten, inwiefern das schneller als Buffer.BlockCopy ist.
Hallo onkel_keks,
Kann ich Marhshal.Copy irgendwie "customizen", sodass ich bestimmen kann, wie die Daten in das byte[] kopiert werden?
nein, gerade beim Vertauschen von zwei Farbkanälen kann man die Daten gerade nicht mehr blockweise kopieren. Das erfordert m.E. immer das Ausprogrammieren der einzelnen Kopieroperationen.
herbivore