El formato de archivo BMP , o mapa de bits , es un formato de archivo de imagen de gráficos rasterizados que se utiliza para almacenar imágenes digitales de mapa de bits , independientemente del dispositivo de visualización (como un adaptador gráfico ), especialmente en los sistemas operativos Microsoft Windows [ 2 ] y OS/2 [ 3 ] .
El formato de archivo BMP permite almacenar imágenes digitales bidimensionales con diversas profundidades de color y, opcionalmente, con compresión de datos , canales alfa y perfiles de color . La especificación Windows Metafile (WMF) abarca el formato de archivo BMP. [ 4 ]
Mapas de bits independientes del dispositivo y el formato de archivo BMP
Microsoft ha definido una representación particular de mapas de bits de color con diferentes profundidades de color, para facilitar el intercambio de mapas de bits entre dispositivos y aplicaciones con diversas representaciones internas. A estos mapas de bits los denominan mapas de bits independientes del dispositivo (DIB, por sus siglas en inglés), y su formato de archivo se conoce como formato de archivo DIB o formato de archivo de imagen BMP.
Según el soporte de Microsoft: [ 5 ]
Un mapa de bits independiente del dispositivo (DIB) es un formato que se utiliza para definir mapas de bits independientes del dispositivo con diversas resoluciones de color. El objetivo principal de los DIB es permitir la transferencia de mapas de bits entre dispositivos (de ahí la parte de "independiente del dispositivo" en su nombre). Un DIB es un formato externo, a diferencia de un mapa de bits dependiente del dispositivo, que aparece en el sistema como un objeto de mapa de bits (creado por una aplicación...). Un DIB se suele transportar en metarchivos (normalmente mediante la función StretchDIBits()), archivos BMP y el portapapeles ( formato de datos CF_DIB ).
Las siguientes secciones describen en detalle los datos almacenados en el archivo BMP o DIB. Este es el formato de archivo BMP estándar. [ 5 ] Algunas aplicaciones crean archivos de imagen de mapa de bits que no cumplen con la documentación de Microsoft. Además, no todos los campos se utilizan; en estos campos no utilizados, el valor será 0.
Estructura de archivos
El archivo de imagen de mapa de bits consta de estructuras de tamaño fijo (encabezados) y estructuras de tamaño variable que aparecen en una secuencia predeterminada. Debido a la larga evolución de este formato de archivo, pueden aparecer en él muchas versiones diferentes de algunas de estas estructuras.
En referencia al diagrama 1, el archivo de mapa de bits está compuesto por estructuras en el siguiente orden:
DIBs en memoria
Un archivo de imagen de mapa de bits cargado en memoria se convierte en una estructura de datos DIB, un componente importante de la API GDI de Windows. La estructura de datos DIB en memoria es casi idéntica al formato de archivo BMP, pero no contiene el encabezado de archivo de mapa de bits de 14 bytes y comienza con el encabezado DIB. Para los DIB cargados en memoria, la tabla de colores también puede constar de entradas de 16 bits que constituyen índices de la paleta actualmente implementada [ 7 ] (un nivel adicional de indirección), en lugar de definiciones de color RGB explícitas. En todos los casos, la matriz de píxeles debe comenzar en una dirección de memoria que sea múltiplo de 4 bytes. En los DIB no empaquetados cargados en memoria, los datos opcionales del perfil de color deben ubicarse inmediatamente después de la tabla de colores y antes de gap1 y la matriz de píxeles [ 6 ] (a diferencia de lo que se muestra en la figura 1).
Cuando el tamaño de gap1 y gap2 es cero, la estructura de datos DIB en memoria se denomina habitualmente "DIB empaquetado" y se puede referenciar mediante un único puntero que apunta al inicio del encabezado DIB. En todos los casos, la matriz de píxeles debe comenzar en una dirección de memoria que sea múltiplo de 4 bytes. En algunos casos, puede ser necesario ajustar el número de entradas en la tabla de colores para forzar que la dirección de memoria de la matriz de píxeles sea un múltiplo de 4 bytes. [ 7 ] Para los "DIB empaquetados" cargados en memoria, los datos opcionales del perfil de color deben seguir inmediatamente a la matriz de píxeles, como se muestra en el diagrama 1 (con gap1=0 y gap2=0). [ 6 ] Los "DIB empaquetados" son necesarios para las funciones de la API del portapapeles de Windows , así como para algunas funciones de pinceles con patrones y recursos de Windows. [ 8 ]
Encabezado de archivo de mapa de bits
Este bloque de bytes se encuentra al inicio del archivo y se utiliza para identificarlo. Una aplicación típica lee este bloque primero para asegurarse de que el archivo sea realmente un archivo BMP y que no esté dañado. Los dos primeros bytes del formato de archivo BMP son el carácter "B" seguido del carácter "M" en codificación ASCII . Todos los valores enteros se almacenan en formato little-endian (es decir, el byte menos significativo primero).
Encabezado DIB (encabezado de información de mapa de bits)
Este bloque de bytes proporciona a la aplicación información detallada sobre la imagen, que se utilizará para mostrarla en pantalla. El bloque coincide con el encabezado utilizado internamente por Windows y OS/2, y presenta varias variantes. Todas contienen un campo dword (32 bits) que especifica su tamaño, lo que permite a la aplicación determinar fácilmente qué encabezado se utiliza en la imagen. La existencia de diferentes encabezados se debe a que Microsoft extendió el formato DIB en varias ocasiones. Los nuevos encabezados extendidos pueden utilizarse con algunas funciones GDI en lugar de las antiguas, lo que proporciona mayor funcionalidad. Dado que GDI admite una función para cargar archivos de mapa de bits, las aplicaciones típicas de Windows utilizan dicha funcionalidad. Como consecuencia, los formatos BMP compatibles con estas aplicaciones coinciden con los formatos compatibles con la versión de Windows que se esté ejecutando. Consulte la tabla a continuación para obtener más información.
El BITMAPCOREHEADER de Windows 2.x difiere del BITMAPCOREHEADER de OS/2 1.x (que se muestra en la tabla anterior) en el detalle de que los campos de ancho y alto de la imagen son enteros con signo, no sin signo. [ 12 ]
Las versiones posteriores a BITMAPINFOHEADER solo agregan campos al final del encabezado de la versión anterior. Por ejemplo: BITMAPV2INFOHEADER agrega campos a BITMAPINFOHEADER y BITMAPV3INFOHEADER agrega campos a BITMAPV2INFOHEADER .
Se introdujo un canal alfa integrado con el encabezado BITMAPV3INFOHEADER no documentado y con el encabezado BITMAPV4HEADER documentado (desde Windows 95 ), y se utiliza en el sistema de inicio de sesión y temas de Windows XP , así como en Microsoft Office (desde la versión 2000). Es compatible con algunos programas de edición de imágenes , como Adobe Photoshop desde la versión 7 y Adobe Flash desde la versión MX 2004 (entonces conocido como Macromedia Flash). También es compatible con GIMP , Google Chrome , Microsoft PowerPoint y Microsoft Word .
Por motivos de compatibilidad, la mayoría de las aplicaciones utilizan las cabeceras DIB antiguas para guardar archivos. Dado que OS/2 dejó de ser compatible después de Windows 2000, actualmente el formato común en Windows es la cabecera BITMAPINFOHEADER . Consulte la siguiente tabla para obtener su descripción. Todos los valores se almacenan como enteros sin signo, salvo que se indique explícitamente lo contrario.
El método de compresión (desplazamiento 30) puede ser:
Un OS/2 2.x OS22XBITMAPHEADER ( BITMAPINFOHEADER2 en la documentación de IBM) contiene 24 bytes adicionales: [ 3 ]
El algoritmo de tramado (desplazamiento 60) puede ser:
Tabla de colores
La tabla de colores (paleta) aparece en el archivo de imagen BMP justo después del encabezado del archivo BMP, el encabezado DIB y después de las tres o cuatro máscaras de bits opcionales si se utiliza el encabezado BITMAPINFOHEADER con la opción BI_BITFIELDS (12 bytes) o BI_ALPHABITFIELDS (16 bytes). Por lo tanto, su desplazamiento es el tamaño de BITMAPFILEHEADER más el tamaño del encabezado DIB (más 12-16 bytes opcionales para las tres o cuatro máscaras de bits). Nota: En Windows CE, el encabezado BITMAPINFOHEADER se puede utilizar con la opción BI_ALPHABITFIELDS [ 14 ] en el miembro biCompression.
El número de entradas en la paleta es 2 n (donde n es el número de bits por píxel) o un número menor especificado en el encabezado (en el formato de encabezado BITMAPCOREHEADER de OS/2 , solo se admite la paleta de tamaño completo). [ 3 ] [ 5 ] En la mayoría de los casos, cada entrada en la tabla de colores ocupa 4 bytes, en el orden azul, verde, rojo, 0x00 (ver más abajo para excepciones). Esto se indexa en BITMAPINFOHEADER en el miembro de estructura biBitCount.
La tabla de colores es un bloque de bytes (una tabla) que enumera los colores utilizados por la imagen. Cada píxel en una imagen de color indexada se describe mediante un número de bits (1, 2, 4 u 8), que es un índice de un color específico descrito en esta tabla. El propósito de la paleta de colores en mapas de bits de color indexados es informar a la aplicación sobre el color real al que corresponde cada uno de estos valores de índice. El propósito de la tabla de colores en mapas de bits no indexados (no paletizados) es enumerar los colores utilizados por el mapa de bits para optimizar su visualización en dispositivos con capacidad limitada de visualización de color y facilitar la conversión futura a diferentes formatos de píxeles y la paletización.
Los colores en la tabla de colores generalmente se especifican en el formato ARGB32 de 4 bytes por entrada . La tabla de colores utilizada con OS/2 BITMAPCOREHEADER utiliza el formato RGB24 de 3 bytes por entrada . [ 3 ] [ 5 ] Para los DIB cargados en memoria, la tabla de colores puede constar opcionalmente de entradas de 2 bytes; estas entradas constituyen índices de la paleta actualmente implementada [ 7 ] en lugar de definiciones de color RGB explícitas.
Microsoft no prohíbe la presencia de una máscara de bits de canal alfa válida [ 15 ] en BITMAPV4HEADER y BITMAPV5HEADER para imágenes en color indexadas de 1 bpp, 4 bpp y 8 bpp, lo que indica que las entradas de la tabla de color también pueden especificar un componente alfa utilizando el formato 8.8.8.[0-8].[0-8] a través del miembro RGBQUAD.rgbReserved [ 16 ] . Sin embargo, algunas versiones de la documentación de Microsoft prohíben esta función al afirmar que el miembro RGBQUAD.rgbReserved "debe ser cero".
Como se mencionó anteriormente, la tabla de colores normalmente no se usa cuando los píxeles están en formato de 16 bits por píxel (16 bpp) o superior; normalmente no hay entradas de tabla de colores en esos archivos de imagen de mapa de bits. Sin embargo, la documentación de Microsoft (en el sitio web de MSDN a fecha de 16 de noviembre de 2010 [ 17 ] ) especifica que para 16 bpp o superior, la tabla de colores puede estar presente para almacenar una lista de colores destinados a la optimización en dispositivos con capacidad de visualización de color limitada, mientras que también especifica que, en tales casos, no hay entradas de paleta indexadas en esta tabla de colores. Esto puede parecer una contradicción si no se hace distinción entre las entradas de paleta obligatorias y la lista de colores opcional.
Almacenamiento de píxeles
Los bits que representan los píxeles del mapa de bits se empaquetan en filas (también conocidas como pasos o líneas de exploración). El tamaño de cada fila se redondea a un múltiplo de 4 bytes (un DWORD de 32 bits ) mediante relleno. [ 18 ]
Para imágenes con una altura superior a 1, se almacenan consecutivamente varias filas rellenas, formando una matriz de píxeles.
El número total de bytes necesarios para almacenar una fila de píxeles se puede calcular de la siguiente manera:
El número total de bytes necesarios para almacenar una matriz de píxeles en una imagen de n bits por píxel (bpp), con 2n colores, se puede calcular teniendo en cuenta el efecto de redondear el tamaño de cada fila a un múltiplo de 4 bytes, como sigue:
Matriz de píxeles (datos de mapa de bits)
La matriz de píxeles es un bloque de DWORD de 32 bits que describe la imagen píxel a píxel. Normalmente, los píxeles se almacenan de abajo hacia arriba, comenzando en la esquina inferior izquierda, avanzando de izquierda a derecha y luego fila por fila desde la parte inferior hasta la parte superior de la imagen. [ 5 ] A menos que se utilice BITMAPCOREHEADER , los mapas de bits de Windows sin comprimir también se pueden almacenar de arriba hacia abajo cuando el valor de la altura de la imagen es negativo.
En el DIB original de OS/2, los únicos cuatro valores válidos de profundidad de color eran 1, 4, 8 y 24 bits por píxel (bpp). [ 5 ] Los encabezados DIB contemporáneos permiten formatos de píxeles con 1, 2, 4, 8, 16, 24 y 32 bits por píxel (bpp). [ 19 ] GDI+ también permite 64 bits por píxel. [ 20 ]
Se deben agregar bytes de relleno (no necesariamente 0) al final de las filas para que la longitud de las filas sea un múltiplo de cuatro bytes. Cuando la matriz de píxeles se carga en la memoria, cada fila debe comenzar en una dirección de memoria que sea un múltiplo de 4. Esta restricción de dirección/desplazamiento es obligatoria solo para matrices de píxeles cargadas en memoria. Para fines de almacenamiento de archivos, solo el tamaño de cada fila debe ser un múltiplo de 4 bytes, mientras que el desplazamiento del archivo puede ser arbitrario. [ 5 ] Un mapa de bits de 24 bits con Ancho=1 tendría 3 bytes de datos por fila (azul, verde, rojo) y 1 byte de relleno, mientras que Ancho=2 tendría 6 bytes de datos y 2 bytes de relleno, Ancho=3 tendría 9 bytes de datos y 3 bytes de relleno, y Ancho=4 tendría 12 bytes de datos y ningún relleno.
Compresión
- Las imágenes en color indexadas se pueden comprimir con el algoritmo RLE de 4 bits u 8 bits o con el algoritmo Huffman 1D.
- OS/2 BITMAPCOREHEADER 2 Las imágenes de 24 bpp se pueden comprimir con el algoritmo RLE de 24 bits.
- Las imágenes de 16 bpp y 32 bpp siempre se almacenan sin comprimir.
- Tenga en cuenta que, si se desea, las imágenes en todas las profundidades de color se pueden almacenar sin compresión.
Formato de píxeles
- El formato de 1 bit por píxel (1 bpp) admite 2 colores distintos (por ejemplo: blanco y negro). Los valores de los píxeles se almacenan en cada bit, y el primer píxel (el de más a la izquierda) se encuentra en el bit más significativo del primer byte. [ 5 ] Cada bit es un índice en una tabla de 2 colores. Un bit sin activar se refiere a la primera entrada de la tabla de colores, y un bit activado se refiere a la última (la segunda) entrada de la tabla de colores.
- El formato de 2 bits por píxel (2bpp) admite 4 colores distintos y almacena 4 píxeles por 1 byte, donde el píxel más a la izquierda se encuentra en los dos bits más significativos ( solo en Windows CE : [ 21 ] ). Cada valor de píxel es un índice de 2 bits en una tabla de hasta 4 colores.
- El formato de 4 bits por píxel (4bpp) admite 16 colores distintos y almacena 2 píxeles por 1 byte, estando el píxel más a la izquierda en el nibble más significativo . [ 5 ] Cada valor de píxel es un índice de 4 bits en una tabla de hasta 16 colores.
- El formato de 8 bits por píxel (8 bpp) admite 256 colores distintos y almacena 1 píxel por cada byte. Cada byte es un índice en una tabla de hasta 256 colores.
- El formato de 16 bits por píxel (16 bpp) admite 65536 colores distintos y almacena 1 píxel por cada palabra de 2 bytes. Cada palabra puede definir las muestras alfa, roja, verde y azul del píxel.
- El formato de 24 bits por píxel (24 bpp) admite 16.777.216 colores distintos y almacena 1 valor de píxel por cada 3 bytes. Cada valor de píxel define las muestras de rojo, verde y azul del píxel (8.8.8.0.0 en notación RGBAX). Específicamente, en el orden: azul, verde y rojo (8 bits por cada muestra). [ 5 ]
- El formato de 32 bits por píxel (32 bpp) admite 4.294.967.296 colores distintos y almacena 1 píxel por cada DWORD de 4 bytes. Cada DWORD puede definir las muestras alfa, roja, verde y azul del píxel.
Para resolver la ambigüedad sobre qué bits definen qué muestras, los encabezados DIB proporcionan ciertos valores predeterminados, así como campos de bits específicos, que son máscaras de bits que definen la pertenencia de un grupo particular de bits en un píxel a un canal particular . El siguiente diagrama define este mecanismo:
Los campos de muestra definidos por las máscaras de bits BITFIELDS deben ser contiguos y no superponerse, pero el orden de los campos de muestra es arbitrario. El orden de campo más común es: Alfa, Azul, Verde, Rojo (MSB a LSB). Las máscaras de bits rojo, verde y azul son válidas solo cuando el miembro Compression del encabezado DIB está configurado como BI_BITFIELDS. La máscara de bits alfa es válida siempre que esté presente en el encabezado DIB o cuando el miembro Compression del encabezado DIB esté configurado como BI_ALPHABITFIELDS [ 14 ] ( solo Windows CE ).
subtipos de vídeo RGB
El mecanismo BITFIELD descrito anteriormente permite definir decenas de miles de formatos de píxeles diferentes; sin embargo, en la práctica solo se utilizan algunos de ellos, [ 22 ] todos los formatos paletizados RGB8, RGB4 y RGB1 (marcados en amarillo en la tabla anterior, definidos en dshow.hlos nombres .MEDIASUBTYPE):
En la versión 2.1.4, FFmpeg admitía (en su propia terminología) los formatos de píxeles BMP bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, gray, pal8 y monob ; es decir, bgra era el único formato de píxeles compatible con transparencia. [ 24 ]

Ejemplo 1
A continuación se muestra un ejemplo de un mapa de bits de 2x2 píxeles y 24 bits (encabezado DIB de Windows BITMAPINFOHEADER ) con formato de píxel RGB24.

Ejemplo 2
A continuación se muestra un ejemplo de un mapa de bits de 4×2 píxeles y 32 bits con valores de opacidad en el canal alfa (encabezado DIB de Windows BITMAPV4HEADER ) con formato de píxel ARGB32.
Tenga en cuenta que los datos del mapa de bits comienzan en la esquina inferior izquierda de la imagen.
Uso del formato BMP
La simplicidad del formato de archivo BMP y su amplia familiaridad en Windows y otros sistemas, así como el hecho de que este formato esté relativamente bien documentado y sea abierto , hacen de BMP un formato muy común que los programas de procesamiento de imágenes de muchos sistemas operativos pueden leer y escribir. Los archivos ICO y CUR contienen mapas de bits que comienzan con BITMAPINFOHEADER.
Muchas interfaces gráficas de usuario antiguas utilizaban mapas de bits en sus subsistemas gráficos integrados; [ 25 ] por ejemplo, el subsistema GDI de las plataformas Microsoft Windows y OS/2 , donde el formato específico utilizado es el formato de archivo de mapa de bits de Windows y OS/2 , generalmente nombrado con la extensión de archivo .BMP. [ 26 ]
Si bien la mayoría de los archivos BMP tienen un tamaño relativamente grande debido a la falta de compresión (o a la codificación de longitud variable con baja relación de compresión en imágenes paletizadas), muchos archivos BMP pueden comprimirse considerablemente con algoritmos de compresión de datos sin pérdida, como ZIP, ya que contienen datos redundantes. Algunos formatos, como RAR , incluso incluyen rutinas específicas para la compresión eficiente de dichos datos.
Formatos relacionados
El sistema X Window utiliza un formato XBM similar para imágenes en blanco y negro, y XPM ( pixelmap ) para imágenes en color. También existen diversos formatos "raw", que guardan los datos sin procesar, sin información adicional. Los formatos Portable Pixmap (PPM) y Truevision TGA también existen, pero se utilizan con menos frecuencia o solo para fines especiales; por ejemplo, TGA puede contener información de transparencia.
Referencias
- ↑ "Consideraciones de IANA" . Tipos de medios de imagen de Windows . IETF . sec. 5. doi : 10.17487/RFC7903 . RFC 7903 .
- 1 2 3 James D. Murray; William vanRyper (abril de 1996). Enciclopedia de formatos de archivos gráficos (segunda edición). O'Reilly . bmp . ISBN 1-56592-161-5. Consultado el 7 de marzo de 2014 .
- 1 2 3 4 5 6 7 8 James D. Murray; William vanRyper (abril de 1996). Enciclopedia de formatos de archivos gráficos (segunda edición). O'Reilly . os2bmp . ISBN 1-56592-161-5. Consultado el 7 de marzo de 2014 .
- 1 2 "[MS-WMF]: Formato de metarchivo de Windows" . MSDN . 13 de febrero de 2014. Consultado el 12 de marzo de 2014 .
- 1 2 3 4 5 6 7 8 9 10 "DIB y sus usos" . Ayuda y soporte técnico de Microsoft . Consultado el 14 de mayo de 2015 .
- 1 2 3 Tipos de encabezados de mapa de bits de MSDN
- 1 2 3 Estructura de MSDN
- ↑ Feng Yuan - Programación de gráficos para Windows: Win32 GDI y DirectDraw: Mapa de bits independiente del dispositivo empaquetado (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
- ↑ Summers, Jason (30-10-2015). "pal8os2v2-16.bmp" . Recuperado el 06-07-2016 .
- ↑ Summers, Jason (30-10-2015). "BMP Suite" . Recuperado el 06-07-2016 .
- ↑ Cox, Chris (15 de noviembre de 2010). "Formato BMP no válido con canal alfa" . Foro de Photoshop para Windows . Adobe . Archivado del original el 27 de enero de 2015. Consultado el 22 de mayo de 2016 .
- ↑ "Mapa de bits de Microsoft Windows: Resumen de la Enciclopedia de formatos de archivos gráficos" .
- 1 2 "Extensiones JPEG y PNG para funciones y estructuras de mapas de bits específicas" .
- 1 2 MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS en el miembro biCompression
- ↑ MSDN – BITMAPV4HEADER : El miembro bV4AlphaMask
- ↑ MSDN – RGBQUAD: miembro reservado para RGB
- ↑ ver nota en biClrUsed MSDN BITMAPINFOHEADER
- ↑ "Image Stride - Aplicaciones Win32" . learn.microsoft.com .
- ↑ MSDN - BITMAPINFOHEADER : El miembro biBitCount
- ↑ "Tipos de mapas de bits" . MSDN . 3 de junio de 2012. Consultado el 16 de marzo de 2014 .
- ↑ MSDN: Estructura de BITMAPINFOHEADER en Windows CE
- 1 2 Adobe Photoshop: Formato BMP Archivado el 22/09/2011 en Wayback Machine
- 1 2 "Subtipos de vídeo RGB sin comprimir" . dshow.h . MSDN . Consultado el 11 de marzo de 2014 .
- ↑ "Formatos de imagen" . Documentación general de FFmpeg . 2014. Consultado el 23 de febrero de 2014 .
- ↑ Julian Smart; Stefan Csomor y Kevin Hock (2006). Programación de interfaces gráficas de usuario multiplataforma con Wxwidgets . Prentice Hall. ISBN 0-13-147381-6.
- ↑ "Archivo de imagen de mapa de bits (BMP), versión 5" . Preservación digital . Biblioteca del Congreso . 8 de enero de 2014. Consultado el 11 de marzo de 2014 .
Enlaces externos
- Estructura de archivos de mapa de bits , en digicamsoft.com
- Introducción a los DIB (mapas de bits independientes del dispositivo) , en herdsoft.com
- Una clase simple de cargador de mapa de bits en C++ , en kalytta.com (A2R10G10B10 aún no disponible)apoyado)
- El formato de archivo BMP, Parte 1 Por David Charlap en la revista de herramientas de software del Dr. Dobb (drdobbs.com), marzo de 1995
- Formatos de archivo de gráficos rasterizados
- Tecnología multimedia de Microsoft Windows