Feedback

VB - Bitmap Header auslesen (File & Info)

Veröffentlicht von am 12/26/2006
(2 Bewertungen)
Ich habe mir mal auf Wikipedia die Spezifikation für eine Bitmap Datei angeschaut und dachte mir das ich mal eine kleine Klasse schreibe um die beiden Header FileHeader und InfoHeader aus einer Bitmap datei auszulesen.

Ihr könnt euch das ja mal anschauen.
Die Informationen könnt ihr hier nachlesen:
http://de.wikipedia.org/wiki/Windows_bitmap
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
Abgelegt unter Bitmap, Header.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!