¿Qué es BMP?
BMP (Bitmap, también llamado DIB — Device Independent Bitmap) es un formato de imagen rasterizada desarrollado por Microsoft para Windows en 1987. Es uno de los formatos de imagen más simples: mínima sobrecarga de metadatos, sin algoritmos de compresión complejos (por defecto), y una disposición binaria directa que mapea directamente cómo las GPU y CPU modernas almacenan datos de píxeles en memoria.
A pesar de haber sido eclipsado por PNG y JPEG para el intercambio de archivos, BMP sigue siendo omnipresente: Windows almacena fondos de pantalla, cursores y recursos del sistema como BMP; es el formato estándar para los bitmaps del Portapapeles de Windows; y sirve como formato intermedio fiable para pipelines de procesamiento de imágenes donde deben evitarse los artefactos de compresión.
Estructura del Archivo
Un archivo BMP tiene tres secciones principales:
1. Cabecera de Archivo (BITMAPFILEHEADER — 14 bytes)
Despl. Tamaño Campo
0 2 Firma: "BM" (0x42 0x4D)
2 4 FileSize: tamaño total del archivo en bytes
6 2 Reserved1: siempre 0
8 2 Reserved2: siempre 0
10 4 DataOffset: desplazamiento en bytes a los datos de píxel
La firma "BM" (0x4D42 en little-endian) es el identificador universal BMP.
2. Cabecera DIB
BMP soporta varias variantes de cabecera DIB, distinguidas por su tamaño en el desplazamiento de byte 14:
| Nombre de Cabecera | Tamaño | Versión Windows |
|---|---|---|
| BITMAPCOREHEADER | 12 bytes | Windows 2.x / OS/2 1.x |
| BITMAPINFOHEADER | 40 bytes | Windows 3.x (1990) — más común |
| BITMAPV4HEADER | 108 bytes | Windows 95 — añade espacio de color |
| BITMAPV5HEADER | 124 bytes | Windows 98/2000 — añade perfil ICC |
La BITMAPINFOHEADER (40 bytes) es con diferencia la más común. El campo Height (altura) puede ser negativo: cuando es negativo, la imagen se almacena de arriba a abajo (primera fila = fila superior). Cuando es positivo, la imagen se almacena de abajo a arriba (primera fila = fila inferior), que es el comportamiento por defecto de BMP.
3. Datos de Píxel
Los datos de píxel comienzan en el desplazamiento especificado en la Cabecera de Archivo. Cada fila (línea de escaneo) está alineada a un límite de 4 bytes:
Paso de fila = ceil(Ancho × BitsPerPixel / 8 / 4) × 4
Profundidades de Color
1 bit (Monocromo)
2 colores desde una tabla de colores de 2 entradas. Cada byte almacena 8 píxeles.
4 bits (16 colores)
Cada byte almacena 2 píxeles. Requiere una tabla de colores de 16 entradas. Paleta estándar de Windows 3.1.
8 bits (256 colores)
Cada byte almacena 1 índice de píxel. Soporta compresión RLE8. Paleta VGA clásica.
24 bits (Color Verdadero)
3 bytes por píxel: Azul, Verde, Rojo (nota: orden BGR, no RGB). El formato BMP más común. Almacena 16,7 millones de colores sin compresión.
Datos de píxel: [B][G][R][B][G][R]...
Azul, luego Verde, luego Rojo — opuesto a la convención RGB
El orden de bytes BGR es un artefacto histórico de la arquitectura little-endian x86.
32 bits (Color Verdadero + Alfa)
4 bytes por píxel: Azul, Verde, Rojo, Alfa. Requiere BITMAPV4HEADER o BITMAPV5HEADER. Windows GDI+ usa bitmaps BGRA de 32 bits de forma nativa.
Modos de Compresión
BI_RGB (0) — Sin Compresión
Datos de píxel en bruto, alineados a 4 bytes por fila. Por defecto y más compatible.
BI_RLE8 (1) — Codificación por Longitud de Carrera para 8 bits
Pares de dos bytes: [recuento][valor] para carreras, o [0][n][píxel1]...[píxelN] para modo absoluto. Efectivo para imágenes con grandes áreas uniformes.
BI_RLE4 (2) — Codificación por Longitud de Carrera para 4 bits
Similar a RLE8 pero para imágenes indexadas de 4 bits.
BI_BITFIELDS (3) — Máscaras de Campo de Bit
No es un método de compresión — especifica máscaras de color de 32 bits para BMP de 16 y 32 bits.
Herramientas para Trabajar con BMP
Python (Pillow)
from PIL import Image
# Leer BMP
img = Image.open('foto.bmp')
print(img.size, img.mode) # (ancho, alto), 'RGB' o 'L' o 'RGBA'
# Convertir a BMP desde cualquier formato
img = Image.open('foto.jpg')
img.save('foto.bmp')
# Guardar como BMP indexado de 8 bits
img_indexed = img.convert('P')
img_indexed.save('foto_8bit.bmp')
FFmpeg
# Extraer fotogramas BMP de video (uno por segundo)
ffmpeg -i video.mp4 -vf fps=1 frame_%04d.bmp
# Convertir PNG a BMP de 24 bits
ffmpeg -i entrada.png salida.bmp
ImageMagick
# Convertir a BMP con profundidad de bits específica
magick entrada.jpg -depth 8 salida.bmp
# Convertir a BMP de 24 bits (sin alfa)
magick entrada.png -flatten salida.bmp
BMP vs PNG vs TIFF
| Característica | BMP | PNG | TIFF |
|---|---|---|---|
| Compresión | Ninguna (por defecto) | Sin pérdidas (Deflate) | Opcional (LZW, Deflate, ninguna) |
| Tamaño típico | El mayor | ~60% del BMP | Similar a BMP o menor |
| Canal alfa | Solo 32 bits | Sí (8 ó 16 bits) | Sí |
| Profundidades de color | 1, 4, 8, 16, 24, 32 bits | 1–16 bits por canal | 1–32 bits por canal |
| Multipágina | No | No | Sí |
| Soporte en navegadores | Parcial | Universal | No |
| Mejor caso de uso | Uso interno de Windows | Gráficos web | Imagen profesional |
¿Cuándo Usar BMP?
Usa BMP cuando:
- Escribas código Windows GDI/GDI+ donde HBITMAP es el tipo nativo
- Almacenes fotogramas intermedios en pipelines de procesamiento de imágenes
- Necesites máxima compatibilidad con aplicaciones Windows heredadas
- Requieras una transferencia píxel a píxel exacta sin pérdidas
No uses BMP cuando:
- El tamaño del archivo importe (PNG es entre un 30-70% más pequeño con compresión sin pérdidas)
- Compartas entre plataformas (PNG y TIFF tienen mejor soporte multiplataforma)
- Entregues contenido web (soporte inconsistente en navegadores)
- Necesites fotografía profesional (TIFF con soporte de metadatos)
La longevidad del BMP es un testimonio de su simplicidad — la transparencia total del formato lo hace ideal para programación a bajo nivel, interfaces de sistema y escenarios donde "lo que almacenas es exactamente lo que obtienes" es la máxima prioridad.