2010-11-22 17 views
3

BonjourUtilisation des pointeurs natifs en F # avec WritableBitmap

Je suis en train d'utiliser WritableBitmap.BackBuffer tel qu'il est utilisé dans this example, voir les exemples de la section.
Ce que j'essaie de faire est vraiment écrire un int[] dans un espace à nativeint points.

Pour pouvoir écrire à partir de int [] vers une mémoire, j'ai commencé à partir de this answer sur SO. Microsoft.FSharp.NativeInterop.NativePtr.write semble être une bonne fonction à utiliser pour écrire. Après avoir essayé et lu un peu deux questions se pose.

  1. WritableBitmap.BackBuffer a le type nativeint, comment convertir en nativeptr que NativePter.write veut?

  2. Il semble que je ne peux écrire un int à la fois, mais je veux écrire un int [] entier.

Je reconnais que je suis en eau profonde, mais il est dans l'eau profonde que vous apprenez à nager :)

Merci d'avance
Gorgen

Répondre

3

Je pense que la fonction NativePtr.write ne peut être utilisé que pour écrire une seule valeur à la fois, donc si vous voulez copier un tableau, vous devrez utiliser une boucle for.

Une option peut être plus facile d'utiliser la méthode Marshal.Copy (see MSDN) qui prend un réseau de source (il y a des surcharges pour des tableaux contenant des éléments de divers types) et intptr comme destination.

Quelque chose comme cela devrait fonctionner:

let imageData = [| ... |] // generate one dimensional array with image data 
writeableBitmap.Lock() 

let buffer = writeableBitmap.BackBuffer 
Marshal.Copy(imageData, 0, buffer, imageData.Length) 
+0

A travaillé très bien, merci – Gorgen

4

Je pense que l'approche proposée par Tomas est logique. Toutefois, pour répondre à votre première question, vous pouvez convertir un nativeint en nativeptr en utilisant la fonction NativeInterop.NativePtr.ofNativeInt.

+0

Même si je suis allé avec l'approche de Tomas est-ce bon à savoir .... – Gorgen