El formato de archivo BMP , o mapa de bits , es un formato de archivo de imagen de gráficos rasterizados utilizado para almacenar imágenes digitales de mapa de bits , independientemente del dispositivo de visualización (como un adaptador de gráficos ), especialmente en los sistemas operativos Microsoft Windows [2] y OS/2 [3] .
El formato de archivo BMP es capaz de almacenar imágenes digitales bidimensionales en varias profundidades de color y, opcionalmente, con compresión de datos , canales alfa y perfiles de color . La especificación Windows Metafile (WMF) cubre el formato de archivo BMP. [4]
Microsoft ha definido una representación particular de mapas de bits de color de diferentes profundidades de color, como una ayuda para intercambiar mapas de bits entre dispositivos y aplicaciones con una variedad de representaciones internas. Los han llamado mapas de bits independientes del dispositivo o DIB, y el formato de archivo para ellos se llama 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 utilizado para definir mapas de bits independientes del dispositivo en varias resoluciones de color. El objetivo principal de los DIB es permitir que los mapas de bits se muevan de un dispositivo a otro (de ahí la parte independiente del dispositivo del nombre). Un DIB es un formato externo, en contraste con 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 normalmente se transporta en metarchivos (normalmente utilizando la función StretchDIBits()), archivos BMP y el Portapapeles ( formato de datos CF_DIB ).
En las siguientes secciones se analizan 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 imágenes de mapa de bits que no cumplen con la documentación de Microsoft. Además, no se utilizan todos los campos; se encontrará un valor de 0 en estos campos no utilizados.
El archivo de imagen de mapa de bits consta de estructuras de tamaño fijo (encabezados) y de estructuras de tamaño variable que aparecen en una secuencia predeterminada. En el archivo pueden aparecer muchas versiones diferentes de algunas de estas estructuras, debido a la larga evolución de este formato de archivo.
Refiriéndonos al diagrama 1, el archivo de mapa de bits se compone de estructuras en el siguiente orden:
Un archivo de imagen de mapa de bits cargado en la 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 la misma que el 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 la memoria, la tabla de colores también puede constar de entradas de 16 bits que constituyen índices de la paleta realizada actualmente [8] (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 un múltiplo de 4 bytes. En los DIB no empaquetados cargados en la memoria, los datos de perfil de color opcionales deben ubicarse inmediatamente después de la tabla de colores y antes de gap1 y la matriz de píxeles [7] (a diferencia de lo que ocurre en el diagrama 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 hacer referencia a ella mediante un único puntero que apunte al comienzo del encabezado DIB. En todos los casos, la matriz de píxeles debe comenzar en una dirección de memoria que sea un múltiplo de 4 bytes. En algunos casos, puede ser necesario ajustar el número de entradas en la tabla de colores para forzar la dirección de memoria de la matriz de píxeles a un múltiplo de 4 bytes. [8] Para los "DIB empaquetados" cargados en la memoria, los datos de perfil de color opcionales deben seguir inmediatamente a la matriz de píxeles, como se muestra en la figura 1 (con gap1=0 y gap2=0). [7]
Los "DIB empaquetados" son necesarios para las funciones de la API del portapapeles de Windows , así como para algunas funciones de pincel y recursos con patrones de Windows. [9]
Este bloque de bytes se encuentra al principio 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 de que no esté dañado. Los primeros 2 bytes del formato de archivo BMP son el carácter "B" y luego el carácter "M" en codificación ASCII . Todos los valores enteros se almacenan en formato little-endian (es decir, el byte menos significativo primero).
Este bloque de bytes proporciona a la aplicación información detallada sobre la imagen, que se utilizará para mostrarla en la pantalla. El bloque también coincide con el encabezado utilizado internamente por Windows y OS/2 y tiene varias variantes diferentes. Todas ellas contienen un campo dword (32 bits), que especifica su tamaño, de modo que una aplicación puede determinar fácilmente qué encabezado se utiliza en la imagen. La razón por la que existen diferentes encabezados es que Microsoft extendió el formato DIB varias veces. Los nuevos encabezados extendidos se pueden utilizar con algunas funciones GDI en lugar de las antiguas, lo que proporciona más funcionalidad. Dado que GDI admite una función para cargar archivos de mapa de bits, las aplicaciones típicas de Windows utilizan esa funcionalidad. Una consecuencia de esto es que para dichas aplicaciones, los formatos BMP que admiten coinciden con los formatos admitidos por la versión de Windows que se está ejecutando. Consulte la tabla siguiente para obtener más información.
El BITMAPCOREHEADER de Windows 2.x se diferencia del BITMAPCOREHEADER de OS/2 1.x (que se muestra en la tabla anterior) en el único detalle de que los campos de ancho y alto de la imagen son números enteros con signo, no sin signo. [13]
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 ha introducido un canal alfa integrado con el BITMAPV3INFOHEADER no documentado y con el BITMAPV4HEADER documentado (desde Windows 95 ) y se utiliza dentro del sistema de inicio de sesión y temas de Windows XP, así como en Microsoft Office (desde v2000); 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 razones de compatibilidad, la mayoría de las aplicaciones utilizan los antiguos encabezados DIB para guardar archivos. Como OS/2 ya no es compatible después de Windows 2000, por ahora el formato común de Windows es el encabezado BITMAPINFOHEADER . Consulte la siguiente tabla para obtener su descripción. Todos los valores se almacenan como números enteros sin signo, a menos que se indique explícitamente.
El método de compresión (desplazamiento 30) puede ser:
Un OS22XBITMAPHEADER de OS/2 2.x ( BITMAPINFOHEADER2 en la documentación de IBM) contiene 24 bytes adicionales: [3]
El algoritmo de semitono (desplazamiento 60) puede ser:
La tabla de colores (paleta) aparece en el archivo de imagen BMP directamente 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 [6] 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 (consulte a continuación las 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 de una imagen de color indexada se describe mediante una cantidad de bits (1, 4 u 8) que es un índice de un único color descrito por 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 con fines de optimización en dispositivos con capacidad limitada de visualización de color y para facilitar la conversión futura a diferentes formatos de píxeles y paletización.
Los colores de la tabla de colores se especifican normalmente 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 la memoria, la tabla de colores puede constar opcionalmente de entradas de 2 bytes; estas entradas constituyen índices de la paleta realizada actualmente [8] en lugar de definiciones explícitas de color RGB.
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 colores 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 característica al indicar que el miembro RGBQUAD.rgbReserved "debe ser cero".
Como se mencionó anteriormente, la tabla de colores normalmente no se utiliza cuando los píxeles están en formato de 16 bits por píxel (16 bpp) (y 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 al 16 de noviembre de 2010 [17] ) especifica que para 16 bpp (y superior), la tabla de colores puede estar presente para almacenar una lista de colores destinados a la optimización en dispositivos con capacidad limitada de visualización de color, mientras que también especifica que, en tales casos, no hay entradas de paleta indexadas presentes en esta tabla de colores. Esto puede parecer una contradicción si no se hace una distinción entre las entradas de paleta obligatorias y la lista de colores opcional.
Los bits que representan los píxeles del mapa de bits se agrupan 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 las imágenes con una altura superior a 1, se almacenan varias filas rellenas de forma consecutiva, formando una matriz de píxeles.
El número total de bytes necesarios para almacenar una fila de píxeles se puede calcular como:
La cantidad total de bytes necesarios para almacenar una matriz de píxeles en una imagen de n bits por píxel (bpp), con 2 n colores, se puede calcular teniendo en cuenta el efecto de redondear el tamaño de cada fila a un múltiplo de 4 bytes, de la siguiente manera:
La matriz de píxeles es un bloque de DWORD de 32 bits que describe la imagen píxel por píxel. Normalmente, los píxeles se almacenan de "abajo hacia arriba", comenzando en la esquina inferior izquierda, 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 Altura de la imagen es negativo.
En el DIB original de OS/2, los únicos cuatro valores legales 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íxel 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]
Los bytes de relleno (no necesariamente 0) deben agregarse 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 las matrices de píxeles cargadas en la 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 Width=1, tendría 3 bytes de datos por fila (azul, verde, rojo) y 1 byte de relleno, mientras que Width=2 tendría 6 bytes de datos y 2 bytes de relleno, Width=3 tendría 9 bytes de datos y 3 bytes de relleno, y Width=4 tendría 12 bytes de datos y ningún relleno.
Para resolver la ambigüedad de qué bits definen qué muestras, los encabezados DIB proporcionan ciertos valores predeterminados, así como BITFIELDS 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 superpuestos, 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 en 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 en BI_ALPHABITFIELDS [6] ( solo Windows CE ).
El mecanismo BITFIELD descrito anteriormente permite la definición de decenas de miles de formatos de píxeles diferentes, sin embargo, solo algunos de ellos se utilizan en la práctica, [22] todos los formatos paletizados RGB8, RGB4 y RGB1 (marcados en amarillo en la tabla anterior, definidos en dshow.h
los 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]
A continuación se muestra un ejemplo de un mapa de bits de 2×2 píxeles y 24 bits (encabezado DIB de Windows BITMAPINFOHEADER ) con formato de píxeles RGB24.
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íxeles ARGB32.
Tenga en cuenta que los datos del mapa de bits comienzan en la esquina inferior izquierda de la imagen.
La simplicidad del formato de archivo BMP y su amplia familiaridad en Windows y otros entornos, así como el hecho de que este formato está relativamente bien documentado y tiene un formato 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 usaban 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 usado es el formato de archivo de mapa de bits de Windows y OS/2 , usualmente nombrado con la extensión de archivo .BMP
. [26]
Si bien la mayoría de los archivos BMP tienen un tamaño de archivo relativamente grande debido a la falta de compresión (o, en general, a la codificación de longitud de ejecución de baja relación en imágenes paletizadas), muchos archivos BMP se pueden comprimir considerablemente con algoritmos de compresión de datos sin pérdida, como ZIP, porque contienen datos redundantes. Algunos formatos, como RAR , incluso incluyen rutinas específicamente dirigidas a la compresión eficiente de dichos datos.
El sistema X Window utiliza un formato similar , XBM, para imágenes en blanco y negro, y XPM ( mapa de píxeles ) para imágenes en color. También existen diversos formatos "raw", que guardan datos sin procesar sin ninguna otra información. También existen los formatos Portable Pixmap (PPM) y Truevision TGA , pero se utilizan con menos frecuencia o solo para fines especiales; por ejemplo, TGA puede contener información de transparencia.