Vous devez connaître le nombre exact d'octets renvoyés et les dimensions de l'image bitmap (hauteur, largeur et codage). Ensuite, vous pouvez déclarer en C# comme:
[DllImport("yourlib.dll")]
private static extern IntPtr GetCurrentImage();
IntPtr que vous obtenez de qui peut être utilisé avec Marshal.Copy
, pour obtenir les octets bruts:
byte[] buffer = new byte[length];
IntPtr beginPtr = GetCurrentImage();
Marshal.Copy(beginPtr, buffer,0,length);
Enfin, déclarer une Bitmap avec les dimensions de votre image et le PixelFormat utilisé (s'il s'agit d'un format de pixel non standard, vous devrez peut-être effectuer une conversion vous-même). Ensuite, vous pouvez copier les données dans les octets bitmap bruts, en utilisant LockBits pour obtenir une instance BitmapData qui pointe vers les données bitmap brutes.
Et qui va se débarrasser de la mémoire allouée par 'GetCurrentImage()'? – Timwi
@Timwi, bien sûr cela dépend du contrat défini dans la DLL externe. Peut-être y a-t-il une fonction à faire qui soit déjà disponible, ou peut-être qu'il faut l'ajouter. Mais bien sûr, le PO devra le prendre en considération. Si la mémoire a été allouée en utilisant LocalAlloc dans le code non managé, on peut utiliser Marshal.FreeHGlobal dans le code managé pour le libérer. – driis
Got it ... la seule chose qui n'était pas vraiment plausible est que le format d'image 24bppRGB est BGR, pas RGB – Thomas