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