27 outubro, 2012

Formato de Arquivo BMP

O BMP, ou Bitmap Image File, é um tipo de arquivo que tem como função armazenar uma imagem seja ela preto e branco, colorida 32bits/pixel, sua largura, altura, resolução e podendo opcionalmente ser comprimida, ter canais alfa e paletas de cores.

A extensão de arquivo pode ser tida como .bmp ou .dib

A consistencia do arquivo BMP se basea tanto em cabeçalhos (Headers) de comprimento fixo como estruturas variaveis.

Segue abaixo a definição da estrutura:

Bitmap File Header
            Tamanho - 14 Bytes
            Obrigatorio, esta parte que esta gravado as informações do arquivo BMP
DIB Header
            Tamanho - Fixo, porem há 7 versoes.
            Obrigatorio, neste cabeçalho armazena informações detalhadas da imagem e define
             o formato do pixel.
Extra Bit Mask
            Tamanho - 12 ou 15 bytes
            Opcional, usado para definir o pixel.
            Presente apenas nos caso que o cabeçalho DIB Header é BITMAPINFOHEADER
Color Table
            Tamanho - Variavel
            Semi-Opcional, Define as cores usadas pelos dados bitmap (Arranjo de Pixel).
            Profundidade de Cores
Gap1
            Tamanho - Variavel
            Opcional, Alinhamento da Estrutura.
            Um artefato do tamanho do arquivo (File Offset) para o arranjo de pixel (PixelArray) no Bitmap
            File Header.
Pixel Array
            Tamanho - Variavel
            Obrigatorio,  define os valores atuais dos pixels.
            O formato do pixel é definido pelo DIB Header ou Extra Bit Mask. Cada linha neste
            trecho é combinado em multiplos de 4 bytes de tamanho.
Gap2
            Tamanho - Variavel
            Opcional, Alinhamento da Estrutura.
            Um artefato do campo ICC Profile Data no DIB Header.
ICC Color Profile
            Tamanho - Variavel
             Opcional, Definição do perfil de cor para um gerenciador de cores.
             Pode tambem conter um caminho para um arquivo externo contendo um perfil de cores.
             Quando carregado na memoria como um "non-packed DIB", ele é locado entre color table e gap1.

O Primeiro bloco de dados do .bmp é o Bitmap File Header, é tambem usado para dar as caracteristicas do arquivo bmp, sendo ele identificar o arquivo, tamanho do arquivo e o endereço inicial dos pixels.

0000H a 0001H - 2 bytes
             Campo do cabeçalho usado para identificar o tipo de arquivo:
             BM (0x42 0x4D) = Windows 3.1x, 95,NT,...etc. (BitMap)
             BA = OS/2 Estrutura de Arranjo Bitmap (Bitmap Array)
             CI  = OS/2 Icone (Color Icon)
             CP = OS/2 Color Pointer
             IC = OS/2 Icone (Icon)
             PT = OS/2 Pointer
0002H a 0005H - 4 bytes
             Tamanho do arquivo BMP em bytes.
0006H a 0007H - 2 bytes
             Reservado; valores deste campo pode depender da aplicação que criou esta imagem.
0008H a 0009H - 2 bytes
             Reservado; valores deste campo pode depender da aplicação que criou esta imagem.
000AH a 000EH - 4 bytes
             Endereço inicial dos pixels, dado em bytes.

O segundo cabeçalho é o DIB Header, tem como função ditar a aplicação informações detalhadas sobre a imagem em questao. Neste cabeçalho temos 7 tipos, sendo eles:

BITMAPCOREHEADER
OS21XBITMAPHEADER
             Tamanho - 12 bytes
             Suportado pelo OS/2 e todos as versoes Windows 3.0 em diante.

BITMAPCOREHEADER2
OS21XBITMAPHEADER
            Tamanho - 64 bytes
            Suportado pelo OS/2.
            Adiciona RLE, compressao Huffman 1D e meio-tons.

BITMAPINFOHEADER
            Tamanho - 40 bytes
            Todas as versoes do Windows 3.0 em diante.
            Remove RLE-24 e compressao Huffman 1D, adiciona 16bpp e 32bpp, e RGB bit mask opcional.
            Usado pelo Adobe Photoshop

BITMAPV2INFOHEADER
            Tamanho - 52 bytes
             Remove RGB Bit Mask opcional.

BITMAPV3INFOHEADER
            Tamanho - 56 bytes
             Adiciona o canal alfa.
             Usado pelo Adobe Photoshop

BITMAPV4HEADER
            Tamanho - 108 bytes
            Todas as versoes do Windows 95/NT4 em diante
            Adiciona tipo de cores e correção de gama

BITMAPV5HEADER
            Tamanho - 124 bytes
            Windows 98/2000 ate os presentes
             Adiciona perfis de cores ICC

Para melhor compatibilidade, muitos aplicativos usa o velho cabeçario DIB para salvar arquivos. Segue abaixo as descrições:

0EH a 11H - Tamanho deste cabeçalho
12H a 15H - Largura do bitmap em pixel (Inteiro Signado)
16H a 19H - Altura do bitmap em pixel (Inteiro Signado)
1AH a 1BH - Numero de planos de cor, deve ser definido 01H.
1CH a 1DH - Numero de bits por pixel, que é a profundidade de cor da imagem. Valores sao de 1,4,8,16,24 e 32.
1EH a 21H - Metodo de compressao usado.
22H a 25H - Tamanho da imagem. Este é o tamanho do dados bruto da imagem, e nao deve ser confudido com o tamanho do arquivo.
26H a 29H - Resolução horizontal da imagem. (Pixel por metro, inteiro signado)
2AH a 2FH - Resolução Vertical da imagem. (pixel por metro, inteiro signado)
2EH a 31H - Numero de cores na paleta, 0 para padrão ou 2**n.
32H a 35H - Numero das cores importantes usados, ou 0 para todas as cores; geralmente ignorado.

O Cabeçalho mais popular é o OS/2 BITMAPCOREHEADER

0EH a 11H - Tamanho do cabeçalho (12 bytes)
12H a 13H - Largura do Bitmap em Pixels.
14H a 15H - Altura do Bitmap em Pixels.
16H a 17H - Numero de planos de cores, deve ser 01H.
18H a 19H - Numero de bit por pixel, sendo 1,4,8 e 24.

Abaixo temos alguns metodos de compressão:

00H - BI_RGB - Metodo Descompresso
01H - BI_RLE8 - RLE 8-bit/pixel
02H - BI_RLE4 - RLE 4-bit/pixel
03H - BI_BITFIELDS - Campo Bit ou Huffman 1D para BITMAPCOREHEADER2
04H - BI_JPEG - JPEG ou RLE-24 para BITMAPCOREHEADER2
05H - BI_PNG - PNG
06H - BI_ALPHABITFIELDS - Campo Bit, valido em Windows CE .net 4.0 e posteriores.

Nota: BI_JPEG e BI_PNG sao desginados para impressoras que suportem e nao para renderização.

Lembrando que o .BMP nao tem patente, portanto pode ser utilizado livremente.

Dados retirados do Wikipedia, para maiores informações acesse:
http://en.wikipedia.org/wiki/Windows_bitmap#Usage_of_BMP_format
http://msdn.microsoft.com/en-us/library/dd183377%28v=vs.85%29.aspx