miércoles, 19 de octubre de 2011

Leer datos de un fichero BMP

En este ejemplo se explica como acceder a la información contenida en un fichero tipo BMP.

Para consultar información acerca de los distintos formatos gráficos:
http://es.wikipedia.org/wiki/Anexo:Formatos_de_archivo_de_gr%C3%A1ficos

Para acceder a los datos solo es preciso conocer que tipo de dato hay escrito en cada posición del fichero, una vez conocidos esos datos solo es preciso leerlos, mediante un BinaryReader.

La estructura del fichero se puede consultar en:
http://es.wikipedia.org/wiki/Windows_bitmap

A continuación se muestra el resumen de los datos que ofrece la wikipedia.


BytesInformación
0, 1Tipo de fichero "BM"
2, 3, 4, 5Tamaño del archivo
6, 7Reservado
8, 9Reservado
10, 11, 12, 13Inicio de los datos de la imagen
14, 15, 16, 17Tamaño de la cabecera del bitmap
18, 19, 20, 21Anchura (píxels)
22, 23, 24, 25Altura (píxels)
26, 27Número de planos
28, 29Tamaño de cada punto
30, 31, 32, 33Compresión (0=no comprimido)
34, 35, 36, 37Tamaño de la imagen
38, 39, 40, 41Resolución horizontal
42, 43, 44, 45Resolución vertical
46, 47, 48, 49Tamaño de la tabla de color
50, 51, 52, 53Contador de colores importantes



El resultado final de la aplicación será el siguiente:



- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - CODIGO DE LA APLICACIÓN - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Public Structure CabeceraDelArchivo
    Public Tipo1 As Byte
    Public Tipo2 As Byte
    Public Tamano As Integer
    Public Reservado1 As Short
    Public Reservado2 As Short
    Public Desplazamiento As Integer
End Structure


Public Structure CabeceraDeLaImagen
    Public Tamano As Integer
    Public Ancho As Integer
    Public Alto As Integer
    Public Planos As Short
    Public Bits As Short
    Public Compresion As Integer
    Public TamanoDeLaImagen As Integer
    Public XPuntosPorMetro As Integer
    Public YPuntosPorMetro As Integer
    Public ColoresUsados As Integer
    Public ColoresImportantes As Integer


End Structure



    Private Sub btnAbrirMapaDeBits_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrirMapaDeBits.Click

        OpenFileDialog1.Filter = "Mapas de bits|*.bmp"
        OpenFileDialog1.ShowDialog()

        'Se carga la imagen en el control PictureBox
        PictureBox1.ImageLocation = OpenFileDialog1.FileName

        'Se crea una variable de cada tipo de estructura
        Dim CabeceraArchivo As CabeceraDelArchivo
        Dim CabeceraImagen As CabeceraDeLaImagen

        'Se abre mediante un lector binario el fichero BMP de la imagen
        Dim fichero As New BinaryReader(File.Open(OpenFileDialog1.FileName, FileMode.Open))

        'Se rellenan los datos de la estructura correspondiente a la cabecera del archivo
        CabeceraArchivo.Tipo1 = fichero.ReadByte()
        CabeceraArchivo.Tipo2 = fichero.ReadByte()
        CabeceraArchivo.Tamano = CInt(fichero.ReadUInt32())
        CabeceraArchivo.Reservado1 = fichero.ReadInt16()
        CabeceraArchivo.Reservado2 = fichero.ReadInt16()
        CabeceraArchivo.Desplazamiento = fichero.ReadInt32()

        'Se rellenan los datos de la estructura correspondiente a la cabecera de la imagen
        CabeceraImagen.Tamano = fichero.ReadInt32()
        CabeceraImagen.Ancho = fichero.ReadInt32()
        CabeceraImagen.Alto = fichero.ReadInt32()
        CabeceraImagen.Planos = fichero.ReadInt16()
        CabeceraImagen.Bits = fichero.ReadInt16()
        CabeceraImagen.Compresion = fichero.ReadInt32()
        CabeceraImagen.TamanoDeLaImagen = fichero.ReadInt32()
        CabeceraImagen.XPuntosPorMetro = fichero.ReadInt32()
        CabeceraImagen.YPuntosPorMetro = fichero.ReadInt32()
        CabeceraImagen.ColoresUsados = fichero.ReadInt32()
        CabeceraImagen.ColoresImportantes = fichero.ReadInt32()

        'Se cierra el fichero
        fichero.Close()

        'Se escribe en el TextBox1 todos los datos leidos del fichero
        TextBox1.Text = "Cabecera del archivo" & vbCrLf & "------------------------------" & vbCrLf

        TextBox1.Text = TextBox1.Text & _
          "Tipo: " & Chr(CabeceraArchivo.Tipo1) & Chr(CabeceraArchivo.Tipo2) & vbCrLf & "Tamano: " & CabeceraArchivo.Tamano & vbCrLf & _
          "Reservado1: " & CabeceraArchivo.Reservado1 & vbCrLf & "Reservado2: " & CabeceraArchivo.Reservado2 & vbCrLf & _
          "Desplazamiento: " & CabeceraArchivo.Desplazamiento & vbCrLf & vbCrLf

        TextBox1.Text = TextBox1.Text & "Cabecera de la imagen" & vbCrLf & "------------------------------" & vbCrLf

        TextBox1.Text = TextBox1.Text & _
          "Tamano: " & CabeceraImagen.Tamano & vbCrLf & _
          "Ancho: " & CabeceraImagen.Ancho & vbCrLf & _
          "Alto: " & CabeceraImagen.Alto & vbCrLf & _
          "Planos: " & CabeceraImagen.Planos & vbCrLf & _
          "Bits: " & CabeceraImagen.Bits & vbCrLf & _
          "Compresion: " & CabeceraImagen.Compresion & vbCrLf & _
          "TamanoDeLaImagen: " & CabeceraImagen.TamanoDeLaImagen & vbCrLf & _
          "XPuntosPorMetro: " & CabeceraImagen.XPuntosPorMetro & vbCrLf & _
          "YPuntosPorMetro: " & CabeceraImagen.YPuntosPorMetro & vbCrLf & _
          "ColoresUsados: " & CabeceraImagen.ColoresUsados & vbCrLf & _
          "ColoresImportantes: " & CabeceraImagen.ColoresImportantes & vbCrLf
    End Sub


No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...