Estructura BITMAPINFOHEADER
Definición
typedef struct tagBITMAPINFOHEADER { // bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER;
Contiene información sobre las dimensiones y formato de color de un mapa de bits independiente del dispositivo (DIB).
Descripción
biSize: especifica el número de bytes requeridos por la estructura.
biWidth: especifica la anchura del mapa de bits en pixels.
biHeight: especifica la altura del mapa de bits en pixels. Si biHeight es positivo, el mapa de bits es un DIB "de abajo a arriba" y su origen es la esquina inferior izquierda. Si biHeight es negativo, el mapa de bits es un DIB "de arriba a abajo" y su origen es la esquina superior izquierda.
biPlanes: especifica el número de planos para el dispositivo objetivo. Este valor debe ser 1.
biBitCount: especifica el número de bits por pixel. Este valor debe ser 1, 4, 8, 16, 24 ó 32.
biCompression: especifica el tipo de compresión para un mapa de bits "de abajo a arriba" comprimido (los DIB "de arriba a abajo" no pueden comprimirse). Puede ser uno de los siguientes valores:
Valor | Descripción |
---|---|
BI_RGB | Formato no comprimido. |
BI_RLE8 | Formato de codificación "run-length" (RLE) para mapas de bits con 8 bits por pixel. El formato de compresión se compone de parejas de bytes consistentes en un byte contador seguido de un byte que contiene un índice de color. Para más información ver la sección de observaciones. |
BI_RLE4 | Formato de codificación (RLE) para mapas de bits con 4 bits por pixel. El formato de compresión se compone de parejas de bytes consistentes en un byte contador seguido de dos índices de color. Para más información ver la sección de observaciones. |
BI_BITFIELDS | Especifica que el mapa de bits no está comprimido y que la tabla de colores consiste en tres máscaras de color de doble palabra que especifican las componentes rojo, verde y azul, respectivamente, de cada pixel. Esto es válido cuando se usa con mapas de bits de 16 y 32 bits por pixel. |
biSizeImage: especifica el tamaño en bytes de la imagen. Debe ser 0 para mapas de bits BI_RGB.
biXPelsPerMeter: especifica la resolución horizontal, en pixels por metro, del dispositivo destino para el mapa de bits. La aplicación puede usar este valor para seleccionar el mapa de bits desde un grupo de recursos que mejor coincida con las características del dispositivo actual.
biYPelsPerMeter: especifica la resolución vertical, en pixels por metro, del dispositivo destino para el mapa de bits.
biClrUsed: especifica el número de índices de color en la tabla de colores que se usan actualmente por el mapa de bits. Si este valor es cero, el mapa de bits usa el número máximo de colores correspondiente al valor del miembro biBitCount para el modo de compresión especificado por biCompression.
Si biClrUsed no es cero y el miembro biBitCount es menor que 16, el miembro biClrUsed especifica el número actual de colores que el motor de gráficos o el manipulador de dispositivo puede acceder. Si biBitCount es 16 ó mayor, el miembro biClrUsed especifica el tamaño de la tabla de colores usada para optimizar el comportamiento de las paletas de colores de Windows. Si biBitCount es 16 ó 32, la paleta de colores óptima empieza inmediatamente a continuación de las tres máscaras de doble palabra.
Si el mapa de bits está empaquetado (un mapa de bits en el que el array del mapa de bits está inmediatamente a continuación de la cabecera BITMAPINFO y que es referenciado por un puntero), el miembro biClrUsed debe ser 0 ó el tamaño actual de la tabla de colores.
biClrImportant: especifica el número de índices de colores que se consideran importantes para mostrar el mapa de bits. Si este valor es cero, todos los colores son importantes.
Observaciones
La estructura BITMAPINFO combina una estructura BITMAPINFOHEADER y una tabla de colores para proporcionar una definición completa de las dimensiones y colores de un DIB. Para mayor información sobre DIBs, ver la descripción de la estructura BITMAPINFO.
Una aplicación debe usar la información almacenada en el miembro biSize para localizar la tabla de colores en una estructura BITMAPINFO, de este modo:
pColor = ((LPSTR)pBitmapInfo + (WORD)(pBitmapInfo->bmiHeader.biSize));
Windows soporta formatos de compresión de mapas de bits que definen sus colores mediante ocho o cuatro bits por pixel. La compresión reduce el espacio requerido para almacenar las imágenes en disco o en memoria. Los siguientes párrafos describen estos formatos.
Cuando el miembro biCompression es BI_RLE8, el mapa de bits está comprimido usando un formato de codificación run-length (RLE) para un mapa de bits de 8 bits. Este formato puede ser comprimido en los modos codificado o absoluto. Ambos modos pueden aparecer en cualquier punto de un mismo mapa de bits.
- El modo codificado consiste en dos bytes: el primero especifica el número de pixels consecutivos a ser trazados usando el índice de color contenido en el segundo byte. Además, el primer byte de la pareja puede ser cero para introducir una secuencia de escape que indica un fin de línea, fin del mapa de bits o delta. La interpretación de la secuencia de escape depende del valor del segundo byte de la pareja, que puede ser uno de los siguientes:
Valor | Significado |
---|---|
0 | Fin de línea. |
1 | Fin del mapa de bits. |
2 | Delta. Los dos bytes que siguen a la secuencia de escape contienen valores sin signo que indican el desplazamiento horizontal y vertical del siguiente pixel desde la posición actual. |
En el modo absoluto, el primer byte es cero y el segundo es un valor entre 03H y FFH. El segundo byte representa el número de bytes que siguen, cada uno de los cuales contiene un índice de color de un pixel. Cuando el segundo byte es 2 o menor, la secuencia de escape tiene el mismo significado que en el modo codificado. En el modo absoluto, cada aparición debe ser alineada en el tamaño de una palabra.
El siguiente ejemplo muestra los valores hexadecimales de 8 bits de un mapa de bits comprimido.
03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01
Este mapa de bits puede expandirse como sigue (los valores de dos dígitos representan un índice de color para un pixel):
04 04 04 06 06 06 06 06 45 56 67 78 78 mover la posición actual 5 a la derecha y 1 abajo 78 78 fin de línea 1E 1E 1E 1E 1E 1E 1E 1E 1E fin de mapa de bits RLE
Cuando el miembro biCompression es BI_RLE4, el mapa de bits está comprimido usando un formato de codificación RLE para mapas de bits de 4 bits, que también pude usar los modos codificado y absoluto:
- En el modo codificado, el primer byte de la pareja contiene el número de pixels a ser trazados usando los índices de color del segundo byte. El segundo byte contiene dos índices de color, uno en los cuatro bits de mayor peso y otro en los cuatro de menor peso. El primer pixel se traza usando el color especificado por los cuatro bits de mayor peso, el segundo se traza usando el color en los cuatro de menor peso, el tercero usando de nuevo los cuatro de mayor peso, y así sucesivamente, hasta que todos los pixels especificados por el primer byte hayan sido trazados.
En el modo absoluto, el primer byte es cero, el segundo byte contiene el número de índices de color que siguen, y los siguientes bytes contienen índices de color en sus cuatro bits de mayor y de menor peso, un índice de color por cada pixel. En el modo absoluto, cada aparición debe estar alineada en palabras. Las secuencias de escape fin de línea, fin de mapa de bits y delta descritas para BI_RLE8 también se aplican a la compresión BI_RLE4.
El siguiente ejemplo muestra los valores hexadecimales de un mapa de bits de 4 bit comprimido.
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01
Este mapa de bits puede expandirse como sigue (cada dígito representa un índice de color para un pixel):
0 4 0 0 6 0 6 0 4 5 5 6 6 7 7 8 7 8 mover la posición actual 5 a la derecha y 1 abajo 7 8 7 8 fin de línea 1 E 1 E 1 E 1 E 1 fin de mapa de bits RLE
Si biHeight es negativo, indicando que se trata de un DIB "de arriba a abajo", biCompression debe ser BI_RGB o BI_BITFIELDS. Los DIBs "de arriba a abajo" no pueden ser comprimidos.