Grafiken in Byte-Arrays speichern

Veröffentlicht: 04. Sep 2003 | Aktualisiert: 27. Jun 2004

Von Mathias Schiffer

In diesem MSDN Quickie zeigen wir Ihnen einen einfachen Weg, Bilder in Byte-Arrays zu speichern (sowie natürlich auch den umgekehrten Weg). So können sie auf einfachste Weise übermittelt oder etwa in Datenbanken abgespeichert werden.

Möchten Sie eine Grafikdatei in ein Byte-Array einlesen, so können Sie sich einfach eines FileStream-Objekts bedienen, mit dessen Hilfe Sie die Datei öffnen. Ein StreamReader-Objekt lässt Sie die auszulesenden Daten direkt in ein Byte-Array übertragen:

Private Overloads Function ImageToBytes( _ 
   ByVal Filename As String) As Byte() 
  ' Liest eine Datei in ein Byte-Array ein. 
  Dim FS As System.IO.FileStream 
  Dim SR As System.IO.StreamReader 
  ' Datei öffnen und in ein entsprechend großes 
  ' Byte-Array lesen 
  FS = New System.IO.FileStream(Filename, _ 
  System.IO.FileMode.Open, _ 
  System.IO.FileAccess.Read, _ 
  System.IO.FileShare.Read) 
  SR = New System.IO.StreamReader(FS) 
  ReDim ImageToBytes(FS.Length - 1) 
  FS.Read(ImageToBytes, 0, FS.Length) 
End Function

Liegt Ihnen hingegen statt einer Datei ein Image-Objekt des Namespace System.Drawing vor, das Sie in ein Byte-Array überführen möchten, steht Ihnen die Klasse ImageConverter hilfreich zur Verfügung. Ihre ConvertTo-Funktion erledigt die Arbeit für Sie im Handumdrehen:

Private Overloads Function ImageToBytes( _ 
   ByVal Img As System.Drawing.Image _ 
   ) As Byte() 
  ' Konvertiert ein Image-Objekt in ein Byte-Array 
  Dim IC As New ImageConverter 
  ' Mithilfe des ImageConverter-Objekts ein Image 
  ' in ein Byte-Array überführen 
  ImageToBytes = CType(IC.ConvertTo( _ 
  Img, GetType(Byte()) _ 
 ), Byte()) 
End Function

Beide Wege sind übrigens im Ergebnis funktional völlig gleichwertig und deswegen mithilfe des Schlüsselworts Overloads mit dem gleichen Funktionsnamen versehen worden. Beim Aufruf der Funktion übergeben Sie entweder einen String als Pfad zur Grafikdatei oder direkt ein System.Drawing.Image-Objekt.

Auch der Rückwärtsgang zu diesem Vorgehen ist dank der Mithilfe des .NET Frameworks und seiner Klasse ImageConverter kein Problem: Aus einem Byte-Array, das einem Image-Objekt entspricht, können Sie ein Image-Objekt ebenfalls durch Aufruf der ImageConverter.ConvertTo-Funktion gewinnen:

Private Function BytesToImage(ByVal ByteArray() As Byte _ 
  ) As System.Drawing.Image 
  ' Konvertiert ein Byte-Array in ein Image-Objekt 
  Dim IC As New ImageConverter 
  ' Mithilfe des ImageConverter-Objekts ein Byte-Array 
  ' in ein Image überführen 
  BytesToImage = CType(IC.ConvertFrom(ByteArray), Image) 
End Function