stringtranslate.com

formato de archivo BMP

El formato de archivo BMP o mapa de bits , es un formato de archivo de imágenes 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]

Mapas de bits independientes del dispositivo y formato de archivo BMP

Diagrama 1: la estructura del archivo de imagen de mapa de bits
Diagrama 1: la estructura del archivo de imagen de mapa de bits

Microsoft ha definido una representación particular de mapas de bits de color de diferentes profundidades de color, como una ayuda para el intercambio de mapas de bits entre dispositivos y aplicaciones con una variedad de representaciones internas. A estos los llamaron 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 del nombre independiente del dispositivo). 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 normalmente se transporta en metarchivos (generalmente usando la función StretchDIBits()), archivos BMP y el Portapapeles ( formato de datos CF_DIB ).

Las siguientes secciones 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.

Estructura de archivos

El archivo de imagen de mapa de bits consta de estructuras de tamaño fijo (encabezados), así como de estructuras de tamaño variable que aparecen en una secuencia predeterminada. Pueden aparecer en el archivo muchas versiones diferentes de algunas de estas estructuras, debido a la larga evolución de este formato de archivo.

Con referencia al diagrama 1, el archivo de mapa de bits se compone de estructuras en el siguiente orden:

DIB en memoria

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 del 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 consistir en entradas de 16 bits que constituyen índices de la paleta actualmente realizada [8] (un nivel adicional de direccionamiento indirecto), 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 la memoria, los datos del perfil de color opcional deben ubicarse inmediatamente después de la tabla de colores y antes del espacio1 y la matriz de píxeles [7] (a diferencia del diagrama 1).

Cuando el tamaño de gap1 y gap2 es cero, la estructura de datos DIB en memoria se suele denominar "DIB empaquetado" y se puede hacer referencia a ella mediante un único puntero que apunta al comienzo 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 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 del perfil de color opcional deben seguir inmediatamente a la matriz de píxeles, como se muestra en el diagrama. 1 (con brecha1=0 y brecha2=0). [7] Las funciones API del portapapeles de Windows , así como algunas funciones de recursos y pinceles con patrones de Windows,
requieren "DIB empaquetados" . [9]

Encabezado del archivo de mapa de bits

Este bloque de bytes se encuentra al comienzo del archivo y se utiliza para identificar el archivo. 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 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).

Encabezado DIB (encabezado de información de mapa de bits)

Este bloque de bytes le brinda a la aplicación información detallada sobre la imagen, que se utilizará para mostrar la imagen en la pantalla. El bloque también coincide con el encabezado utilizado internamente por Windows y OS/2 y tiene varias variantes diferentes. Todos ellos contienen un campo dword (32 bits) que especifica su tamaño, de modo que una aplicación pueda determinar fácilmente qué encabezado se utiliza en la imagen. La razón por la que hay encabezados diferentes es que Microsoft extendió el formato DIB varias veces. Los nuevos encabezados extendidos se pueden usar con algunas funciones GDI en lugar de las anteriores, 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 ejecuta. Consulte la siguiente tabla 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 detalle de que los campos de ancho y alto de la imagen son 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 en el sistema de inicio de sesión y temas de Windows XP, así como en Microsoft Office (desde v2000); es compatible con algunos software 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 encabezados DIB más antiguos para guardar archivos. Dado que 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 su descripción. Todos los valores se almacenan como enteros sin signo, a menos que se indique explícitamente.

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 medios tonos (desplazamiento 60) puede ser:

tabla de colores

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 máscaras de tres o cuatro 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 , sólo 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 las excepciones a continuación). Esto está indexado 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 en color indexada se describe mediante una cantidad de bits (1, 4 u 8), que es un índice de un solo color descrito en esta tabla. El propósito de la paleta de colores en mapas de bits de colores 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 de visualización de color limitada y para facilitar la futura conversión a diferentes formatos de píxeles y paletización.

Los colores de la tabla de colores normalmente se especifican en formato RGBA32 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 consistir opcionalmente en entradas de 2 bytes; estas entradas constituyen índices de la paleta actualmente realizada [8] en lugar de definiciones de color RGB explícitas.

Microsoft no rechaza 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 1bpp, 4bpp y 8bpp, lo que indica que las entradas de la tabla de colores también pueden especificar un componente alfa usando 8.8.8.[ 0-8].[0-8] formato a través del miembro RGBQUAD.rgbReserved [16] . Sin embargo, algunas versiones de la documentación de Microsoft no permiten esta característica al indicar 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) (y superior); Normalmente no hay entradas en la tabla de colores en esos archivos de imágenes de mapa de bits. Sin embargo, la documentación de Microsoft (en el sitio web de MSDN a partir del 16 de noviembre de 2010 [17] ) especifica que para 16 bpp (y superiores), la tabla de colores puede estar presente para almacenar una lista de colores destinados a la optimización en dispositivos con limitaciones. capacidad de visualización en 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 ninguna distinción entre las entradas obligatorias de la paleta y la lista de colores opcional.

Almacenamiento de píxeles

Los bits que representan los píxeles del mapa de bits están empaquetados en filas (también conocidas como zancadas o líneas de escaneo). 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 varias filas rellenas consecutivamente, formando una matriz de píxeles.

El número total de bytes necesarios para almacenar una fila de píxeles se puede calcular como:

ImageWidth se expresa en píxeles. La ecuación anterior utiliza las funciones de piso y techo .

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 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. , como sigue:

ImageHeight se expresa en píxeles. El valor absoluto es necesario porque ImageHeight se expresa como un número negativo para imágenes de arriba hacia abajo.

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 por píxel. Por lo general, 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 a abajo, cuando el valor de Altura de la imagen es negativo.

En el DIB OS/2 original, 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í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 aumentar la longitud de las filas a 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 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 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

Formato de píxeles

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:

Diagnóstico. 2 – El mecanismo BITFIELDS para un píxel de 32 bits representado en notación de longitud de muestra RGBAX
Diagnóstico. 2 – El mecanismo BITFIELDS para un píxel de 32 bits representado en notación de longitud de muestra RGBAX

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 ubicuo es: Alfa, Azul, Verde, Rojo (MSB a LSB). Las máscaras de bits roja, verde y azul sólo son válidas cuando el miembro de compresión del encabezado DIB está establecido en BI_BITFIELDS. La máscara de bits alfa es válida siempre que esté presente en el encabezado DIB o cuando el miembro de compresión del encabezado DIB esté establecido en BI_ALPHABITFIELDS [6] ( sólo Windows CE ).

Diagnóstico. 3 – El formato de píxel con un canal alfa para un píxel de 16 bits (en notación de longitud de muestra RGBAX) realmente generado por Adobe Photoshop[22]
Diagnóstico. 3 – El formato de píxel con un canal alfa para un píxel de 16 bits (en notación de longitud de muestra RGBAX) realmente generado por Adobe Photoshop [22]
Todos los formatos de píxeles posibles en un DIB
Todos los formatos de píxeles posibles en un DIB

Subtipos de vídeo RGB

El mecanismo BITFIELD descrito anteriormente permite la definición de decenas de miles de formatos de píxeles diferentes, sin embargo, en la práctica solo se utilizan varios de ellos, [22] todos los formatos paletizados RGB8, RGB4 y RGB1 (marcados en amarillo en la tabla anterior, definidos en dshow.hnombres .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 de un mapa de bits de 2×2 píxeles, con codificación de 24 bits/píxel

Ejemplo 1

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

0,0: blue 0000FF FF0,1: green 00FF00 FF0,2: red FF00000 FF0,3: white FFFFFF FF1,0: blue 0000FF 7F, half transparent1,1: green 00FF00 7F, half transparent1,2: red FF0000 7F, half transparent1,3: white FFFFFF 7F, half transparent
Ejemplo 2 de un mapa de bits de 4×2 píxeles, con codificación de 32 bits/píxel

Ejemplo 2

A continuación se muestra un ejemplo de un mapa de bits de 32 bits y 4 × 2 píxeles 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 lugares, así como el hecho de que este formato está relativamente bien documentado y tiene un formato abierto , hace que BMP sea un formato muy común que los programas de procesamiento de imágenes de muchos sistemas operativos pueden usar. Lee y escribe. Los archivos ICO y CUR contienen mapas de bits que comienzan con BITMAPINFOHEADER.

Muchas interfaces gráficas de usuario más 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 , normalmente denominado 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 generalmente a una codificación de longitud de ejecución de baja proporción en imágenes paletizadas), muchos archivos BMP se pueden comprimir considerablemente con algoritmos de compresión de datos sin pérdidas , como ZIP, porque contienen archivos redundantes. datos. Algunos formatos, como RAR , incluso incluyen rutinas específicamente dirigidas a 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 ( mapa de píxeles ) para imágenes en color. También hay una variedad de formatos "sin procesar", que guardan datos sin procesar sin ninguna otra información. Los formatos Portable Pixmap (PPM) y Truevision TGA también existen, pero se utilizan con menos frecuencia o sólo para fines especiales; por ejemplo, TGA puede contener información de transparencia.

Referencias

  1. ^ "Consideraciones de la IANA". Tipos de medios de imagen de Windows. segundo. 5.doi : 10.17487 /RFC7903 . RFC 7903.
  2. ^ a b C James D. Murray; William vanRyper (abril de 1996). Enciclopedia de formatos de archivos gráficos (Segunda ed.). O'Reilly . bmp. ISBN 1-56592-161-5. Consultado el 7 de marzo de 2014 .
  3. ^ abcdefgh James D. Murray; William vanRyper (abril de 1996). Enciclopedia de formatos de archivos gráficos (Segunda ed.). O'Reilly . os2bmp. ISBN 1-56592-161-5. Consultado el 7 de marzo de 2014 .
  4. ^ ab "[MS-WMF]: formato de metarchivo de Windows". MSDN . 2014-02-13 . Consultado el 12 de marzo de 2014 .
  5. ^ abcdefghij "DIB y sus usos". Ayuda y soporte técnico de Microsoft . Consultado el 14 de mayo de 2015 .
  6. ^ abc MSDN - BITMAPINFOHEADER (Windows CE 5.0): BI_ALPHABITFIELDS en miembro biCompression
  7. ^ Tipos de encabezados de mapa de bits de MSDN abc
  8. ^ Estructura abc MSDN BITMAPINFO
  9. ^ Feng Yuan - Programación de gráficos de Windows: Win32 GDI y DirectDraw: mapa de bits empaquetado independiente del dispositivo (CreateDIBPatternBrush, CreateDIBPatternBrushPt, FindResource, LoadResource, LockResource)
  10. ^ Veranos, Jason (30 de octubre de 2015). "pal8os2v2-16.bmp" . Consultado el 6 de julio de 2016 .
  11. ^ Veranos, Jason (30 de octubre de 2015). "Suite BMP" . Consultado el 6 de julio de 2016 .
  12. ^ Cox, Chris (15 de noviembre de 2010). "Formato BMP no válido con canal alfa". Foro de Photoshop para Windows . Adobe . Archivado desde el original el 27 de enero de 2015 . Consultado el 22 de mayo de 2016 .
  13. ^ "Mapa de bits de Microsoft Windows: resumen de la enciclopedia de formatos de archivos gráficos".
  14. ^ ab "Extensiones JPEG y PNG para estructuras y funciones de mapas de bits específicas".
  15. ^ MSDN - BITMAPV4HEADER : el miembro bV4AlphaMask
  16. ^ MSDN - RGBQUAD: miembro rgbReserved
  17. ^ ver nota en biClrUsed MSDN BITMAPINFOHEADER
  18. ^ "Image Stride: aplicaciones Win32". aprender.microsoft.com .
  19. ^ MSDN - BITMAPINFOHEADER : el miembro biBitCount
  20. ^ "Tipos de mapas de bits". MSDN . 2012-06-03 . Consultado el 16 de marzo de 2014 .
  21. ^ MSDN: Windows CE - Estructura BITMAPINFOHEADER
  22. ^ ab Adobe Photoshop: formato BMP Archivado el 22 de septiembre de 2011 en Wayback Machine.
  23. ^ ab "Subtipos de vídeo RGB sin comprimir". dshow.h . MSDN . Consultado el 11 de marzo de 2014 .
  24. ^ "Formatos de imagen". Documentación general de FFmpeg . 2014 . Consultado el 23 de febrero de 2014 .
  25. ^ Julián inteligente; Stefan Csomor y Kevin Hock (2006). Programación GUI multiplataforma con Wxwidgets. Prentice Hall. ISBN 0-13-147381-6.
  26. ^ "Archivo de imagen de mapa de bits (BMP), versión 5". Preservación Digital . Biblioteca del Congreso . 2014-01-08 . Consultado el 11 de marzo de 2014 .

enlaces externos