Imports System.IO
''' <summary>
''' Klasse um File und Infor Header aus einer Bitmap Datei auszulesen.
''' </summary>
''' <remarks>Tim Hartwig</remarks>
Public Class BitmapInformation
Public Structure BITMAPFILEHEADER
''' <summary>Der Typ der Datei, sollte bei Bitmap Dateien immer "BM" sein.</summary>
Public bfType As String
''' <summary>Die Dateigröße der Bitmap Datei.</summary>
Public bfSize As UInt32
''' <summary>Reservierter Bereich, ist normalerweise 0</summary>
Public bfReserved As UInt32
''' <summary>Die Gesamtgröße aller Header und Bilddaten, danach kommen die Informationen für das eigentliche Bild.</summary>
Public bfOffBits As UInt32
End Structure
Public Structure BITMAPINFOHEADER
''' <summary>Die Größe dieses InfoHeaders, sollte 40 sein.</summary>
Public biSize As UInt32
''' <summary>Die Breite des Bilds.</summary>
Public biWidth As UInt32
''' <summary>Die Höhe des Bilds.</summary>
Public biHeight As UInt32
''' <summary>Die Anzahl der Farbebenen, wird nicht mehr verwendet, steht normalerweise auf 1.</summary>
Public biPlanes As UInt16
''' <summary>Die Farbtiefe des Bilds in Bit.</summary>
Public biBitCount As UInt16
''' <summary>Die Kompressionseinstellung für das Bild. 0, 1, 2 oder 3.</summary>
Public biCompression As UInt32
''' <summary>Die Fläche des Bilds in QuadratPixel (Breite*Höhe).</summary>
Public biSizeImage As UInt32
''' <summary>Horizontale Auflösung des Zielausgabegerätes in Pixel pro Meter, jedoch meistens auf 0.</summary>
Public biXPelsPerMeter As UInt32
''' <summary>Vertikale Auflösung des Zielausgabegerätes in Pixel pro Meter, jedoch meistens auf 0.</summary>
Public biYPelsPerMeter As UInt32
''' <summary>Parameter für eine eventuelle Farbtabelle nach diesem InfoHeader.</summary>
Public biClrUsed As UInt32
''' <summary>Wenn biBitCount=1, 4 oder 8: Die Anzahl sämtlicher im Bild verwendeten Farben; 0 bedeutet alle Farben der Farbtabelle.</summary>
Public biClrImportant As UInt32
End Structure
''' <summary>
''' Diese Methode ließt die Header (File u. Info) aus einer Bitmap Datei.
''' </summary>
''' <param name="FileName">Der Name der Bitmap Datei dessen Header ausgelesen werden sollen.</param>
''' <param name="FileHeader">Eine Instanz eines BITMAPFILEHEADER Objekts als Referenz.</param>
''' <param name="InfoHeader">Eine Instanz eines BITMAPINFOHEADER Objekts als Referenz.</param>
''' <remarks></remarks>
Public Sub ReadData(ByVal FileName As String, ByRef FileHeader As BITMAPFILEHEADER, ByRef InfoHeader As BITMAPINFOHEADER)
'Bytes aus Bitmap Datei einlesen
Dim FS As New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim Buffer(54 - 1) As Byte
FS.Read(Buffer, 0, 54)
FS.Close()
'FileHeader Daten auslesen
FileHeader.bfType = ByteToString(Buffer, 0, 2)
FileHeader.bfSize = BitConverter.ToInt32(Buffer, 2) 'Der BitConverter.ToInt32 ließt immer nur 4 Bytes aus
FileHeader.bfReserved = BitConverter.ToInt32(Buffer, 6)
FileHeader.bfOffBits = BitConverter.ToInt32(Buffer, 10) 'Sollte 54 sein, wenn nicht folgen optionale Informationen ab Byte 54
'InfoHeader Daten auslesen
InfoHeader.biSize = BitConverter.ToInt32(Buffer, 14) 'Sollte 40 sein
InfoHeader.biWidth = BitConverter.ToInt32(Buffer, 18)
InfoHeader.biHeight = BitConverter.ToInt32(Buffer, 22)
InfoHeader.biPlanes = BitConverter.ToInt16(Buffer, 26)
InfoHeader.biBitCount = BitConverter.ToInt16(Buffer, 28)
InfoHeader.biCompression = BitConverter.ToInt32(Buffer, 30)
InfoHeader.biSizeImage = BitConverter.ToInt32(Buffer, 34)
InfoHeader.biXPelsPerMeter = BitConverter.ToInt32(Buffer, 38)
InfoHeader.biYPelsPerMeter = BitConverter.ToInt32(Buffer, 42)
InfoHeader.biClrUsed = BitConverter.ToInt32(Buffer, 46)
InfoHeader.biClrImportant = BitConverter.ToInt32(Buffer, 50)
End Sub
Private Function ByteToString(ByVal Expression() As Byte, ByVal StartIndex As Integer, ByVal Length As Integer) As String
Return System.Text.Encoding.Default.GetString(Expression, StartIndex, Length)
End Function
End Class