Hbitmap Handle mit LabVIEW lesen

Bei der Arbeit mit Grafiken in textbasierten Programmiersprachen hat man es oft mit Bitmaps zu tun. Ein Handle auf die Bitmap im Speicher hat den Datentyp HBitmap. In diesem Beitrag beschreibe ich, wie man die Bitmap nach LabVIEW bekommt.

.NET bietet in der Klasse System.Drawing.Bitmap die Methode „Save“ an, mit der man in einem selbst gewählten Dateiformat, zum Beispiel PNG oder BMP, die Bitmap auf der Festplatte speichern kann. Man benötigt dazu die Bitmap-Referenz. Siehe Bild, VI Snippet.

System.Drawing.Bitmap Save Methode

In LabVIEW kann man mit dem Standard-VI „PNG Datei lesen“ (engl. „Read PNG File“) das Bild von der Festplatte laden und in LabVIEW verwenden.

Es geht allerdings auch eleganter ohne den langsamen Umweg über die Festplatte. Die Klasse System.Drawing.Bitmap stellt die Methode GetHbitmap bereit, die ein Handle auf die Bitmap im Speicher zurück gibt.

Dieses Handle kann man in LabVIEW natürlich nicht unmittelbar verwenden, aber es gibt eine Standard Windows DLL, die das Handle entgegen nimmt die Bytes der Bitmap zurückgibt: GDI32.dll mit der Methode GetBitmapBits.

GetBitmapBits übergibt man den aus Hbitmap erzeugten Hashcode (mit System.IntPtr GetHashCode) und die Anzahl der zu lesenden Bytes . Liegt die Bitmap im 24bppRGB Format vor, ist die Anzahl der zu lesenden Bytes die Pixelanzahl multipliziert mit 4 (ein Datenwort (32bit) pro Pixel).

Das von GetBitmapBits zurückgegebene Array „Bitmap Pixel“ enthält pro Element (U32) in den unteren 24 Bit jeweils 8 Bit für Rot, Grün und Blau. Der letzte Schritt ist also die Umwandlung des Arrays in ein LabVIEW Image. Der Cluster „Image Data“ verwendet pro Pixel 3 Elemente im Array für die einzelnen Farbwerte. Es muss also ein Array angelegt werden mit der Dimension Pixelanzahl im Bild mal 3. Das Umwandeln des Arrays „Bitmap Pixel“ in ein LabVIEW Image zeigt das folgende VI Snippet.

Natürlich stelle ich das komplette LabVIEW 2011 VI bereit.

Get Image from HBitmap Handle.vi

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.