¿Qué significa bmp? ¿Cuál es la extensión de archivo BMP? ¿Qué programa abrir la extensión bmp?

BMP(del ingles Imagen de mapa de bits) es un formato de almacenamiento de imágenes rasterizadas desarrollado por Microsoft.

Una gran cantidad de programas funcionan con el formato BMP, ya que su soporte está integrado en los sistemas operativos Windows y OS/2. Los archivos BMP pueden tener extensiones .bmp, .dib y .rle. Además, los datos en este formato se incluyen en archivos de recursos RES binarios y archivos PE.

Microsoft también ha desarrollado para sus necesidades los formatos ICO y CUR, que tienen una estructura similar a BMP. Además, algunas funciones WinAPI del subsistema GDI utilizan estructuras de este formato.

Las profundidades de color en este formato pueden ser 1, 2, 4, 8, 16, 24, 32, 48 bits por píxel, pero oficialmente no se admiten 2 bits por píxel. En este caso, para profundidades de color inferiores a 16 bits, se utiliza una paleta con componentes a todo color con una profundidad de 24 bits.

En el formato BMP, las imágenes se pueden almacenar tal cual o utilizando algunos algoritmos de compresión comunes. En particular, el formato BMP admite la compresión RLE sin pérdida de calidad, y los sistemas operativos y el software modernos permiten el uso de JPEG y PNG (estos formatos están integrados en BMP como contenedor).

DIB y DDB

Cuando se utiliza el formato DIB Mapa de bits independiente del dispositivo, ráster independiente del dispositivo), el programador puede acceder a todos los elementos de las estructuras que describen la imagen mediante un puntero normal. Pero estos datos no se utilizan para controlar directamente la pantalla, ya que siempre se almacenan en la memoria del sistema y no en la memoria de vídeo dedicada. El formato de píxeles en la RAM puede diferir del formato que debe almacenarse en la memoria de video para mostrar un punto del mismo color. Por ejemplo, el formato DIB puede utilizar 24 bits para especificar un píxel y, en este momento, el adaptador de gráficos puede funcionar en modo HiColor con una profundidad de color de 16 bits. En este caso, el punto rojo brillante se especificará en un formato independiente del hardware con tres bytes 0x0000ff y en la memoria de video con la palabra 0xF800. Al copiar una imagen a la pantalla, el sistema dedicará tiempo adicional a convertir códigos de color del formato de 24 bits al formato de búfer de video.

Descripción general de la estructura de archivos

El archivo BMP consta de cuatro partes:

  1. Encabezado del archivo (BITMAPFILEHEADER)
  2. Título de la imagen (BITMAPINFOHEADER, puede faltar). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Paleta (puede que falte)
  4. La imagen misma

ENCABEZADO DE BITMAFILE

Esta estructura contiene información sobre el tipo, tamaño y representación de los datos en el archivo. Tamaño 14 bytes.

Etiqueta de estructura TypedefBITMAPFILEHEADER ( WORD bfType; // desplazamiento 0 bytes desde el principio del archivo DWORD bfTamaño; // desplazamiento de 2 bytes desde el principio del archivo, longitud de 4 bytes PALABRA bfReservado1; PALABRA bfReservado2; DWORD bfOffBits;

// desplazamiento de 10 bytes desde el principio del archivo, longitud de 4 bytes

  • ) BITMAPFILEHEADER, * PBITMAPFILEHEADER;
  • El tipo WORD debe ser de 16 bits, los tipos DWORD y LONG deben ser de 32 bits, el tipo LONG debe estar firmado y se supone que el orden de bytes es little endian.
  • bfType: tipo de archivo, caracteres "BM" (en HEX: 0x42 0x4d).
  • bfSize: el tamaño de todo el archivo en bytes.

bfReserved1 y bfReserved2 están reservados y deben contener ceros.

bfOffBits: contiene el desplazamiento en bytes desde el comienzo de la estructura BITMAPFILEHEADER hasta los propios bits de la imagen.

Después del encabezado del archivo

ENCABEZADO DE MAPA DE BITS

La opción de encabezado más simple. Las aplicaciones para Windows NT3.51 y anteriores sólo pueden utilizar esta estructura. Tamaño 40 bytes.

  • 0 - tiene sentido para Win98/Me/2000/XP. El número de bits por píxel determina el formato JPEG o PNG.
  • 1 - imagen monocromática. El miembro bmiColors de la estructura BITMAPINFO contiene dos elementos. Cada bit de una imagen representa un píxel; si el bit es cero, el píxel tiene el color del primer elemento de la tabla bmiColors; en caso contrario, el color del segundo.
  • 4 - imagen de dieciséis colores. Los píxeles se definen mediante índices de 4 bits, cada byte de la imagen contiene información sobre dos píxeles: los 4 bits más significativos para el primero y los restantes para el segundo.
  • 8: la paleta contiene hasta 256 colores, cada byte de la imagen almacena un índice en la paleta por un píxel.
  • 16 - si el campo biCompression contiene el valor BI_RGB, el archivo no contiene una paleta. Cada dos bytes de la imagen almacenan la intensidad de los componentes rojo, verde y azul de un píxel. En este caso, no se utiliza el bit más significativo; se asignan 5 bits para cada componente: 0RRRRRGGGGGGBBBBB.
    Si el campo biCompression contiene el valor BI_BITFIELDS, la paleta almacena tres valores de cuatro bytes que definen una máscara para cada uno de los tres componentes de color. Cada píxel de una imagen está representado por un valor de dos bytes del cual se extraen los componentes de color mediante máscaras. Para WinNT/2000/XP, las secuencias de bits de cada componente deben seguirse continuamente, sin superponerse ni cruzarse con las secuencias de otros componentes. Para Win95/98/Me - sólo se admiten las siguientes máscaras: 5-5-5, donde la máscara del componente azul es 0x001F, verde 0x03E0, rojo 0x7C00; y 5-6-5, donde la máscara del componente azul es 0x001F, verde 0x07E0, rojo 0xF800.
  • 24 - la paleta no se utiliza, cada tres bytes de la imagen representa un píxel, un byte para la intensidad de los canales azul, verde y rojo, respectivamente.
  • 32 - Si el campo biCompression contiene el valor BI_RGB, la imagen no contiene paleta. Cada cuatro bytes de la imagen representan un píxel, un byte para la intensidad de los canales azul, verde y rojo respectivamente. No se suele utilizar el byte más significativo de cada quad, pero permite almacenar datos del canal alfa.
    Si el campo biCompression contiene el valor BI_BITFIELDS, en la paleta se almacenan tres máscaras de color de cuatro bytes, para los componentes rojo, verde y azul. Cada píxel de una imagen está representado por cuatro bytes. WinNT/2000: las máscaras de los componentes no deben superponerse ni intersectarse. Windows 95/98/Me: el sistema admite sólo un modo de compresión, completamente similar al modo sin compresión BI_RGB: el byte más significativo de cada cuatro se utiliza como canal alfa, los tres siguientes están reservados para el azul, el verde y el rojo. canales, respectivamente: 0xAARRGGBB.
biCompression Tipo de compresión para imágenes comprimidas:
Significado Identificador Compresión
0 BI_RGB imagen sin comprimir
1 BI_RLE8 Compresión RLE para imágenes de 8 bits
2 BI_RLE4 Compresión RLE para imágenes de 4 bits
3 BI_BITFIELDS la imagen no está comprimida, la paleta contiene tres máscaras de 4 bytes para los componentes de color rojo, verde y azul. Utilizado para imágenes de 16 y 32 bits.
4 BI_JPEG Win98/Me/2000/XP: compresión JPEG
5 BI_PNG Win98/Me/2000/XP: compresión PNG
6 BI_ALPHABITFIELDS WinCE: la imagen no está comprimida, la paleta contiene cuatro máscaras de 4 bytes para los componentes de color rojo, verde, azul y transparente (canal alfa). Utilizado para imágenes de 16 y 32 bits.
biSizeImage Tamaño de la imagen en bytes. Puede contener cero para imágenes BI_RGB. Win98/Me/2000/XP: si biCompression contiene BI_JPEG o BI_PNG, biSizeImage especifica el tamaño del búfer de imagen BI_JPEG o BI_PNG.
biXPelsPerMeter Resolución horizontal en píxeles por metro para el dispositivo de destino. Una aplicación puede utilizar este valor para seleccionar de un grupo de recursos de imágenes la imagen más adecuada para el dispositivo actual. Para DPI 96, que Microsoft acepta para monitores, será igual a 3780 (si se calcula mediante la fórmula (96 / 25,4) * 1000).
En una imagen empaquetada, la matriz de píxeles sigue inmediatamente la estructura BITMAPINFO, biClrUsed debe contener cero o el tamaño de paleta real.

biClrImportant El número de elementos de paleta necesarios para mostrar la imagen. Si contiene cero, todos los índices son igualmente importantes.

La estructura BITMAPINFO combina BITMAPINFOHEADER y la paleta, proporcionando una descripción completa de las dimensiones y colores de una imagen.

Para encontrar la paleta en la estructura BITMAPINFO, la aplicación debe utilizar la información almacenada en biSize de la siguiente manera:

PColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-> bmiHeader.biSize) );

El ráster generalmente se almacena en forma de espejo vertical. Pero también es posible almacenar el ráster en forma no reflejada verticalmente. Una señal de que el ráster en BMP no está en forma de espejo vertical se especifica mediante el parámetro biHeight.

BITMAPV4HEADER

Una versión ampliada de la estructura descrita anteriormente. Win NT 3.51 y versiones anteriores deben utilizar la estructura BITMAPINFOHEADER. Win98/Me/2000/XP puede utilizar la estructura BITMAPV5HEADER en lugar de la estructura BITMAPV4HEADER.

Estructura Typedef (DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; DWORD bV4ClrUsed DW; ORD bV4ClrImportant; DWORD bV4GreenMask; ; CIEXYZTRIPLE bV4Endpoints; DWORD bV4GammaGreen;

  • Los campos desde el principio de la estructura hasta bV4ClrImportant inclusive tienen el mismo propósito que los campos correspondientes de la estructura BITMAPINFOHEADER.
  • bV4RedMask: máscara de color del componente rojo de cada píxel, utilizada sólo si bV4Compression contiene el valor BI_BITFIELDS.
  • bV4GreenMask: máscara de color del componente verde de cada píxel, utilizada sólo si bV4Compression contiene el valor BI_BITFIELDS.
  • bV4BlueMask: máscara de color del componente azul de cada píxel, utilizada sólo si bV4Compression contiene el valor BI_BITFIELDS.
  • bV4AlphaMask: máscara que define el componente del canal alfa.
  • bV4CSType: define el espacio de color de la imagen.
  • bV4GammaRed: curva de tono del componente rojo. Se ignora si bV4CSType no contiene un valor LCS_CALIBRATED_RGB. Indicado en formato 16×16.
  • bV4GammaGreen: curva de tono del componente verde. Se ignora si bV4CSType no contiene un valor LCS_CALIBRATED_RGB.
  • bV4GammaBlue: curva de tono del componente azul. Se ignora si bV4CSType no contiene un valor LCS_CALIBRATED_RGB.

ENCABEZADO BITMAPV5

Win95/NT 4.0: las aplicaciones pueden utilizar BITMAPV4HEADER. Win NT 3.51 y versiones anteriores deben utilizar la estructura BITMAPINFOHEADER.

Estructura Typedef (DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; DWORD bV5ClrUsed; bV5ClrImportant; DWORD bV5GreenMask; DWORD bV5Al phaMask; CIEXYZTRIPLE bV5Puntos finales; DWORD bV5GammaBlue; ; 5ENCABEZADO;

Para los campos desde el principio de la estructura hasta bV5GammaBlue inclusive, solo se describirán las diferencias con las versiones anteriores: BITMAPINFOHEADER y BITMAPV4HEADER.

  • bV5CSType: define el espacio de color de la imagen, puede tomar los siguientes valores:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent: puede tomar los siguientes valores:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData: desplazamiento en bytes desde el principio de la estructura hasta el comienzo de los datos del perfil (nombre del archivo del perfil, una cadena que consta exclusivamente de una tabla de códigos de 1252 caracteres y que termina en un byte cero). Se ignora si bV5CSType contiene un valor distinto de PROFILE_LINKED y PROFILE_EMBEDDED.
  • bV5ProfileSize: tamaño de los datos del perfil en bytes.
  • bV5Reservado - reservado. Contiene cero.

Paleta

La paleta puede contener una secuencia de campos de cuatro bytes según la cantidad de colores disponibles (256 para una imagen de 8 bits). Los tres bytes bajos de cada campo determinan la intensidad de los componentes rojo, verde y azul del color; el byte alto no se utiliza. Cada píxel de la imagen se describe en este caso mediante un byte que contiene el número del campo de la paleta en el que se almacena el color de este píxel.

Si un píxel de una imagen se describe mediante un número de 16 bits, la paleta puede almacenar tres valores de dos bytes, cada uno de los cuales define una máscara para extraer los componentes de color rojo, verde y azul del píxel de 16 bits.

Es posible que un archivo BMP no contenga una paleta si almacena una imagen a todo color sin comprimir.

Datos de imagen

Una secuencia de píxeles grabados de una forma u otra. Los píxeles se almacenan fila por fila, de abajo hacia arriba. Cada línea de imagen se rellena con ceros hasta una longitud múltiplo de cuatro bytes.

En archivos bmp con una profundidad de color de 24 bits, los bytes de color de cada píxel se almacenan en orden BGR (Azul, Verde, Rojo).

En archivos bmp con una profundidad de color de 32 bits, los bytes de color de cada píxel se almacenan en orden BGRA (Azul, Verde, Rojo, Alfa)

Profundidad de bits de la imagen

Dependiendo del número de colores representados, a cada punto se le asignan de 1 a 48 bits:

  • 1 bit: imagen monocromática (dos colores).
  • 2 bits: 4 colores posibles (modos de funcionamiento CGA) (el modo de 2 bits no está estandarizado oficialmente, pero se utiliza).
  • 4 bits - Imagen de 16 colores (modos de funcionamiento EGA).
  • 8 bits (1 byte): 256 colores, el último de los modos que admite colores indexados (ver más abajo).
  • 16 bits (2 bytes) - modo HiColor, para 5-6-5 = 65536 tonos posibles, para 5-5-5 = 32768 tonos posibles.
  • 24 bits (3 bytes): color verdadero. Debido a que 3 bytes no se asignan bien a potencias de dos (especialmente cuando se almacenan datos en la memoria, donde la alineación de los datos en el límite de una palabra es importante), a menudo se usa una imagen de 32 bits. En el modo TrueColor, a cada uno de los tres canales (en modo RGB) se le asigna 1 byte (256 valores posibles), el número total de colores es .
  • 32 bits (4 bytes): este modo es casi similar a TrueColor, el cuarto byte generalmente no se usa o el canal alfa (transparencia) se encuentra en él.
  • 48 bits (6 bytes): un formato poco utilizado con mayor precisión de color (16 bits por canal), compatible con una cantidad relativamente pequeña de programas y equipos.

Colores indexados

Cuando el número de bits es 1 (2 colores), 2 (4 colores), 4 (16 colores) u 8 (256 colores) por píxel, se puede utilizar un modo de color indexado especial. En este caso el número correspondiente a cada píxel no indica el color, sino el número del color en la paleta. Al utilizar una paleta, es posible adaptar la imagen a los colores presentes en la imagen. En este caso, la imagen no está limitada por colores específicos, sino por la cantidad máxima de colores utilizados simultáneamente.

Programa de ejemplo

El siguiente programa abre un archivo BMP de 24 bits en una XWindow, la profundidad de color debe ser de 32 bits, no funciona con reproducciones de color inferiores, ya que complica el ejemplo:

/* Compilado con la línea: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */#incluir #incluir #incluir #incluir #incluir #incluir #incluir #incluir #incluir #incluir #incluir #include "bitmap.h" /* Aquí están las definiciones del encabezado BMP como se describe anteriormente en este artículo */ XImage estática * CreateImageFromBuffer(Display*, unsigned char *, int, int); main(int argc, char * argv ) ( Display * dis; Window win; /* Nuestra ventana */ Evento XEvent; /* Eventos */ GC gc;/* Contexto de gráficos */< 2 ) { perror ("use: xtest file.bmpXImagen * imagen; int n, ancho, alto, fd, tamaño; XImagen * imagen; datos de carácter * sin firmar; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; carbón * buf; si (argc \norte") ; salir(1);) if ((fd = open(argv[ 1 ] , O_RDONLY) ) == - 1 ) ( printf ("Error al abrir mapa de bits ) ; salir(1); /* Leer en el buffer */ n = leer(fd, buf, tamaño); imprimirf("tamaño = %d bytes leídos\n " , norte); imagen = CreateImageFromBuffer(dis, buf, ancho, alto); /* Elimina el buffer - ya no lo necesitamos */ gratis(buf); XMapWindow(dis, ganar); XSelectInput(dis, win, ExposureMask | KeyPressMask); while (1) (XNextEvent(dis, & evento); if (event.xany.window == win) ( switch (event.type) ( case Exponer: XPutImage(dis, win, gc, image, 0, 0, 0 , 0, imagen-> ancho, imagen-> altura); romper; caso KeyPress: if (XLookupKeysym(& event.xkey, 0) == XK_q) ( XDestroyImage(imagen); XCloseDisplay(dis); close(fd); salir (EXIT_SUCCESS); romper; predeterminado: romper;/* Crea una imagen X a partir de un archivo BMP, ya que la imagen BMP se almacena al revés * y se refleja; esto se corrige en el bucle */ XImage * CreateImageFromBuffer(Display * dis, unsigned char * buf, int width, int height) ( int profundidad, pantalla; XImage * img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t * imgBuf; int ind = 0 ; línea interna; int ih;/* Números de fila y columna para reflejar */< numBmpBytes; i++ ) { unsigned int r, g, b; int nuevo_ind;/* Nuevo índice */ screen = DefaultScreen(dis) ; profundidad = profundidad predeterminada (dis, pantalla); temperatura = ancho * 3;<< 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; línea = temperatura + ancho % 4 ;/* Longitud de la cadena teniendo en cuenta la alineación */

El formato de archivo BMP (abreviatura de BitMaP) es el formato de gráficos rasterizados nativo para Windows porque se asemeja más al formato nativo de Windows en el que ese sistema almacena sus matrices rasterizadas. La extensión de nombre de archivo más utilizada en formato BMP es BMP, aunque algunos archivos tienen la extensión RLE, que significa codificación de longitud de ejecución. La extensión RLE de un nombre de archivo generalmente indica que la información ráster del archivo se ha comprimido utilizando uno de los dos métodos de compresión RLE que son válidos para archivos de formato BMP.

En los archivos BMP, la información de color de cada píxel está codificada en 1, 4, 8, 16 o 24 bits (bits/píxel). La cantidad de bits por píxel, también llamada profundidad de color, determina la cantidad máxima de colores en una imagen. Una imagen con una profundidad de 1 bit/píxel puede tener sólo dos colores, y con una profundidad de 24 bits/píxel, más de 16 millones de colores diferentes.

El siguiente diagrama muestra la estructura de un archivo BMP típico que contiene una imagen de 256 colores (8 bits/píxel de profundidad). El archivo se divide en cuatro secciones principales: el encabezado del archivo de gráficos rasterizados, el encabezado de información de la matriz rasterizada, la tabla de colores y los datos de la matriz rasterizada en sí. El encabezado de un archivo de gráficos rasterizados contiene información sobre el archivo, incluida la dirección en la que comienza el área de datos de la matriz rasterizada. El encabezado de información de la matriz ráster contiene información sobre la imagen almacenada en el archivo, como su alto y ancho en píxeles. La tabla de colores proporciona los valores de colores primarios RGB (rojo, verde, azul) para los colores utilizados en la imagen. Los programas que leen y muestran archivos BMP, cuando utilizan adaptadores de video que no permiten mostrar más de 256 colores, pueden establecer mediante programación dichos valores RGB en las paletas de colores de los adaptadores para una reproducción precisa del color.

El formato de los datos de la matriz ráster real en un archivo BMP depende de la cantidad de bits utilizados para codificar los datos de color de cada píxel. Con una imagen de 256 colores, cada píxel en la parte del archivo que contiene los datos de la matriz ráster real se describe en un byte (8 bits). Esta descripción de píxel no representa valores de color RGB, pero sirve como puntero para ingresar a la tabla de colores del archivo. Por lo tanto, si R/G/B=255/0/0 se almacena como el primer valor de color RGB en la tabla de colores de un archivo BMP, entonces al valor del píxel 0 en la matriz ráster se le asignará el color rojo brillante. Los valores de píxeles se almacenan en orden de izquierda a derecha, comenzando (normalmente) en la fila inferior de la imagen. Por lo tanto, en un archivo BMP de 256 colores, el primer byte de datos de la matriz ráster es el índice del color del píxel ubicado en la esquina inferior izquierda de la imagen; el segundo byte representa el índice del color del píxel adyacente a la derecha, etc. Si el número de bytes en cada fila es impar, se agrega un byte adicional a cada fila para alinear los datos de la matriz ráster en límites de 16 bits. .


No todos los archivos BMP tienen una estructura como la que se muestra en el diagrama. Por ejemplo, los archivos BMP de 16 y 24 bits/píxeles no tienen tablas de colores; En estos archivos, los valores de píxeles de la matriz ráster caracterizan directamente los valores de color RGB. Los formatos de almacenamiento interno de secciones individuales del archivo también pueden diferir. Por ejemplo, la información de matriz ráster en algunos archivos BMP de 16 y 256 colores se puede comprimir utilizando el algoritmo RLE, que reemplaza secuencias de píxeles de imagen idénticos con tokens que especifican el número de píxeles en la secuencia y su color. En Windows, puede trabajar con archivos BMP de estilo OS/2 que utilizan varios formatos de tabla de color y encabezado de matriz de trama.

Este artículo trata sobre cómo se ve el formato gráfico bmp. Aunque este es uno de los formatos más simples, debido a que existen muchas variaciones de este formato, no todos los puntos son obvios. Entonces, deja de echar agua, comencemos.

Estructuras de formato

El formato bmp (de las palabras BitMaP - mapa de bits o, en ruso, matriz de bits) es una imagen sin comprimir (en su mayoría) que es bastante fácil de leer y mostrar en el sistema operativo Windows, que tiene funciones API especiales que ayudan.

Primero, demos una representación gráfica de los datos en bmp (imagen tomada de MSDN).

Al principio hay un encabezado de archivo (BITMAPFILEHEADER). Se describe a continuación:

bfTipo determina el tipo de archivo. Aquí debería ser BM. Si abres cualquier archivo BMP en un editor de texto (o mejor aún, en un editor hexadecimal), verás que los dos primeros caracteres son BM (de la palabra BitMap, como probablemente ya habrás adivinado).
bfTamaño es el tamaño del archivo en bytes. Estrictamente hablando, deberías calcularlo (lo cual es recomendado), pero configuré el tamaño del archivo incorrectamente (aunque no a propósito :)) y no hubo problemas (ACDSee leyó sin problemas, mi programa funcionó), pero no te recomiendo escríbalo deliberadamente mal, de repente aparecerá un programa concienzudo que comparará este tamaño con el real y decidirá que no es bmp, sino otra cosa. Idealmente, todos los programas, para asegurarse de que se trata de un bmp real y no falso, deberían, en primer lugar, comprobar que bfType contiene "BM" (sin comillas) y, en segundo lugar, que bfSize sea igual al tamaño del archivo.
bfReservado1 y bfReservado2 están reservados y deben ser cero.
bfOffBits. Este es uno de los campos más importantes de esta estructura. Muestra dónde comienza el mapa de bits en relación con el comienzo del archivo (o, como dice MSDN, "desde el principio de la estructura BITMAPFILEHEADER"), que describe la imagen. Es decir, para tener la garantía de llegar al principio del array debes escribir:

etiqueta de estructura typedefBITMAPINFOHEADER
{
DWORD biTamaño;
LARGO biAncho;
LARGO biAltura;
PALABRA biPlanos;
PALABRA biBitCount;
DWORD biCompresión;
DWORD biSizeImage;
LONG biXPelsPerMeter;
BiYPelsPerMeter largos;
DWORD biClrUtilizado;
DWORD biClrImportante;
) BITMAPINFOHEADER, * PBITMAPINFOHEADER;

biTamaño es el tamaño de la estructura misma. Debe inicializarse de la siguiente manera: bih.biSize = sizeof(BITMAPINFOHEADER);
Aquí nuevamente asumiremos que bih se declara de la siguiente manera: BITMAPINFOHEADER bih;
biAncho y biAlto establezca el ancho y alto de la imagen en píxeles, respectivamente.
biplanos especifica el número de aviones. Por ahora siempre está configurado en 1.
biBitCount- Número de bits por píxel. Hablaremos más sobre esto a continuación.
biCompresión indica el tipo de compresión. No se sorprenda ni tenga miedo de que bmp experimente repentinamente una compresión. Personalmente no he visto más de un bmp comprimido (pero no digo que no existan). Si no hay compresión, entonces este indicador debe establecerse en BI_RGB. En este artículo estamos hablando del formato sin comprimir, por lo que ni siquiera enumeraré otras opciones. Parece que se usa la misma estructura en los archivos JPEG y PNG, porque a partir de Windows 98 había opciones BI_JPEG, lo que muestra que esta imagen es JPEG y BI_PNG, que es PNG (no sé nada sobre el formato Jpeg, Acabo de sacar estas conclusiones basándome en lo que está escrito en MSDN).
biTamañoImagen Indica el tamaño de la imagen en bytes. Si la imagen no está comprimida (es decir, el campo anterior está configurado en BI_RGB), entonces se debe escribir un cero aquí. biXPelsPorMetro Y biYPelsPerMetro denotan, respectivamente, la resolución horizontal y vertical (en píxeles por metro) del dispositivo final en el que se generará el mapa de bits (ráster). Una aplicación puede utilizar este valor para seleccionar de un grupo de recursos el mapa de bits más apropiado para el dispositivo deseado. El caso es que el formato bmp es esencialmente un ráster independiente del hardware, es decir, cuando la apariencia de lo obtenido no depende de en qué se proyecta este ráster (por así decirlo). Por ejemplo, una imagen tendrá el mismo aspecto independientemente de si está dibujada en la pantalla de un monitor o impresa en una impresora. Pero la resolución de los dispositivos es diferente, y es precisamente para seleccionar la imagen más adecuada entre las disponibles que se utilizan estos parámetros.
biClrUsado Determina el número de colores utilizados de la tabla. Si este valor es cero, entonces el ráster utiliza la cantidad máxima de colores permitidos por el valor biBitCount. Esto sólo es relevante para imágenes comprimidas. Si biClrUsed es distinto de cero y biBitCount es menor que 16, entonces biClrUsed determina la cantidad actual de colores de controlador de dispositivo o motor gráfico disponibles. Si biBitCount es mayor o igual a 16, entonces biClrUsed determina el tamaño de la tabla de colores utilizada para optimizar la paleta del sistema actual.
biClrImportante- este es el número de colores importantes. Determina la cantidad de colores que se necesitan para representar el dibujo. Si este valor es 0 (como suele ser), entonces todos los colores se consideran importantes.

Tipos de formato BMP

Todo tipo de formato bmp. condicionalmente Se puede dividir en dos tipos: paleta y no paleta. Es decir, si la paleta se utiliza en un formato determinado o no. Tenga en cuenta que la paleta puede incluso estar en formatos sin paleta, pero no se utiliza allí. En los bmps sin paleta, el color se calcula directamente a partir de los bits que van en el archivo, partiendo de un lugar determinado. Y en las paletas, cada byte describe uno o más píxeles, y los valores de los bytes (o bits) son el índice de color en la paleta. Para empezar, proporcionaré una tabla que compara las opciones posibles. El tipo de imagen (con paleta o sin paleta) depende de cuántos bits se dan por píxel, es decir, del valor biBitCount de la estructura BITMAPINFOHEADER.

biBitCountFormato de paleta o sin paletaNúmero máximo posible de colores.Notas 1 Paleta2 Una imagen de paleta de dos colores, claro está, no necesariamente en blanco y negro. Si el bit de trama (que está justo debajo) se restablece (igual a 0), esto significa que el primer color de la paleta debe estar en este lugar, y si está configurado (igual a 1), entonces el segundo. 4 Paleta16 Cada byte describe 2 píxeles. Aquí hay un ejemplo de MSDN. Si el primer byte de la imagen es 0x1F, entonces corresponde a dos píxeles, el color del primero es el segundo color de la paleta (porque la cuenta regresiva comienza desde cero) y el segundo píxel es. el decimosexto color de la paleta. 8 Paleta256 Una de las opciones más habituales. Pero al mismo tiempo, los más sencillos. La paleta ocupa un kilobyte (pero es mejor no contar con ello). Un byte es un color. Además, su valor es el número de color en la paleta. 16 Sin paleta2^16 o 2^15Esta es la opción más confusa. Comencemos con el hecho de que no tiene paleta, es decir, cada dos bytes (una palabra de PALABRA) en el ráster define de forma única un píxel. Pero esto es lo que sucede: hay 16 bits y 3 componentes de color (rojo, verde, azul). Pero 16 no quiere dividirse entre 3. Por lo tanto, aquí hay dos opciones. La primera es utilizar 15 bits en lugar de 16, luego hay 5 bits para cada componente de color. De esta forma podemos utilizar un máximo de 2^15 = 32768 colores y obtener un triple R-G-B = 5-5-5. Pero luego un poco de 16 se desperdicia en vano, pero sucede que nuestros ojos, entre todos los colores, perciben mejor el verde, así que decidimos darle este poco al componente verde, es decir, entonces obtenemos el. triple R-G-B = 5-6-5, y ahora podemos usar 2^16 = 65536 colores. Pero lo más desagradable es que se utilizan ambas opciones. MSDN sugiere que para distinguir cuántos colores se utilizan, complete el campo biClrUsed de la estructura BITMAPINFOHEADER con este valor. Para seleccionar cada componente es necesario utilizar las siguientes máscaras. Para formato 5-5-5: 0x001F para el componente azul, 0x03E0 para el verde y 0x7C00 para el rojo. Para el formato 5-6-5: 0x001F - componentes azules, 0x07E0 - verdes y 0xF800 rojos, respectivamente. 24 Sin paleta2^24 Y este es el formato más simple. Aquí 3 bytes definen 3 componentes de color. Es decir, un componente por byte. Simplemente leemos la estructura RGBTRIPLE y usamos sus campos rgbtBlue, rgbtGreen, rgbtRed. Van en ese orden. 32 Sin paleta2^32 Aquí 4 bytes definen 3 componentes. Pero, sin embargo, no se utiliza un byte. Se puede utilizar, por ejemplo, para el canal alfa (transparencia). En este caso, es conveniente leer el ráster utilizando estructuras RGBQUAD, las cuales se describen a continuación:

Almacenamiento de datos en formato bmp.

Bueno, ahora llegamos a la parte más interesante. Después de las estructuras BITMAPFILEHEADER y BITMAPINFOHEADER viene la paleta. Además, si el formato no tiene paleta, es posible que no esté ahí, pero no debes contar con ello. El hecho es que cuando recién comenzaba a comprender el formato bmp, leí en un libro que, supuestamente, si el formato no tiene paleta, entonces no tiene paleta alguna. Incluso había dos imágenes: diagramas de formato: uno con paleta y el otro sin ella. Y en ese momento estaba escribiendo un programa que opera diligentemente con archivos bmp. Y tuve que convertir las imágenes entrantes de 256 colores a 24 bits (si las hubiera) en archivos temporales. Y simplemente no creé una paleta en 24 bits (bfOffBits de la estructura BITMAPFILEHEADER era igual a la suma de sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER), y dejé los entrantes de 24 bits sin cambios. Con rásteres de 256 colores, todo funcionó como debería, hasta que no encontré una imagen de 24 bits que mostraba basura en la parte inferior en lugar de la parte requerida. No entendí de inmediato qué estaba mal hasta que comparé el tamaño del archivo original con el. teórica que debería haber estado allí si no hubiera habido una paleta. La diferencia resultó ser exactamente 1 KB. Había una paleta. Por lo tanto, nunca cuente con si hay una paleta y no confíe en su tamaño. (aunque todas las imágenes que encontré tenían un tamaño de paleta de 256 colores, o 1 Kb), muévase siempre por el archivo hasta el principio del ráster, usando bfOffBits. La paleta es una matriz de estructuras RGBQUAD una tras otra. no todos los colores se utilizan en la paleta (sino solo, por ejemplo, 16), entonces a menudo se asignan 256 campos para la paleta A 256 * 4 = 1024, donde 4 es el tamaño de la estructura RGBQUAD, es decir, lo mismo. Se obtiene un kilobyte.

Inmediatamente después de la paleta viene el ráster. Aquí es donde las cosas se vuelven más confusas. En primer lugar, los píxeles se describen aquí como está escrito en la tabla anterior, según el formato. Y ellos mismos pueden contener el valor de los componentes de color (para los que no tienen paleta), o pueden ser índices de una matriz de paleta. La imagen en sí se graba línea por línea. En segundo lugar, la imagen parece estar al revés. Es decir, la línea inferior se escribe primero, luego la penúltima línea y así sucesivamente hasta la parte superior. Y, en tercer lugar, como está escrito, si el tamaño de la línea ráster no es múltiplo de 4, entonces se rellena con de 1 a 3 bytes vacíos (cero) para que la longitud de la línea sea un múltiplo del párrafo. Esto es lo más desagradable. El hecho es que para cada formato tienes que ajustar esta cantidad de bytes vacíos (aunque me gusta escribir parte de la paleta allí, simplemente no quiero crear variables "cero" adicionales si estos bytes se omiten de todos modos y nadie los necesita). Proporciono una tabla con fórmulas que muestran para qué formato cuántos bytes se deben agregar al final de la línea. Allí, la variable Ancho, como puedes imaginar, significa el ancho de la imagen. Todas estas fórmulas fueron establecidas experimentalmente. Daré un ejemplo sólo para los formatos más utilizados. Por lo demás, puedes escribirlo tú mismo.

Programas de ejemplo

Puedes descargar todas las fuentes. No escribiré mucho aquí. Solo daré las funciones con comentarios.

Hola 1. Creando una imagen en formato bmp.
Aquí se crea una imagen monocromática. Hay tres ejemplos de tales funciones: creación de bmp de 8, 16 y 24 bits. Sólo daré por 16 bits.

// Creemos una imagen en formato bmp de 16 bits como 5-5-5, que será simplemente monocromática
void CreateBmp555(char * fname, color de WORD)
{
MANEJAR hArchivo;
DWORD RW;
int i, j;

// Declarar las estructuras necesarias
BITMAPFILEHEADERbfh;
BITMAPINFOHEADERbih;
Paleta BYTE[1024];

// paleta
// Tengamos una imagen de 35 x 50 píxeles
int Ancho = 35;

int Altura = 50; memset(Paleta, 0, 1024);
// En la paleta tenemos ceros, rellénalos

memset (&bfh, 0, tamaño de (bfh)); Bfh.bfType = 0x4D42;
// Indicamos que este es bmp "BM" bfh.bfOffBits = tamaño de (bfh) + tamaño de (bih) + 1024;
// La paleta ocupa 1Kb, pero no la usaremos
bfh.bfSize = bfh.bfOffBits +
tamaño de (color) * Ancho * Alto + Alto * ((tamaño de (color) * Ancho) % 4 );
//Calcular el tamaño del archivo final
memset (& bih, 0, tamaño de (bih));
bih.biTamaño = tamaño de(bih); // Así es como se supone que debe ser
bih.biBitCount = 16; // Usamos 5-5-5
bih.biCompresión = BI_RGB;
// Sin compresión
bih.biHeight = Altura;
bih.biWidth = Ancho;
bih.biPlanos = 1 ;

// debería ser 1
// Y los campos restantes siguen siendo 0
HFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

si (hFile == INVALID_HANDLE_VALUE)
devolver ;
//Escribir los encabezados

WriteFile (hFile, & bfh, tamaño de (bfh), & RW, NULL);
WriteFile (hFile, & bih, tamaño de (bih), & RW, NULL);
// Escribe la paleta< Height; i++ )
{
WriteFile(hFile, Paleta, 1024, &RW, NULL);< Width; j++ )
{
para (yo = 0; yo
}

para (j = 0 ; j
WriteFile (hFile, & color, sizeof (color), & RW, NULL);
}
// Alinear con el borde
}

WriteFile (hFile, Paleta, (tamaño de (color) * Ancho) % 4, & RW, NULL);

CloseHandle(hFile);

color - color de la imagen. El valor de esta variable debe completarse según la primera tabla. Puede ver la imagen resultante en ACDSee, por ejemplo. Intenté abrirlo en Photoshop, pero resultó que no puede leerlos en este formato. Pero tú puedes :).
{
BITMAPFILEHEADERbfh;
BITMAPINFOHEADERbih;
Ejemplo 2. Convertir una imagen del formato de 8 bits (256 colores) a 24 bits.
BOOL Convert256To24 (char * fin, char * fout)
int Ancho, Alto;
Paleta RGBQUAD[ 256 ] ;
BYTE * enBuf;
DWORD RW;
RGBTRIPLE * salidaBuf;
int i, j;

MANEJAR hacia adentro, hacia afuera;
DWORD OffBits;
HIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

si (hIn == INVALID_HANDLE_VALUE)
devolver FALSO;
{
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
HIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
}

si (hOut == INVALID_HANDLE_VALUE)
CerrarMango(hIn);
// leer los datos
ReadFile (hIn, & bfh, tamaño de (bfh), & RW, NULL);

ReadFile (hIn, & bih, tamaño de (bih), & RW, NULL);
ReadFile (hIn, Paleta, 256 * tamaño de (RGBQUAD), & RW, NULL);
// Establece el puntero al comienzo del ráster
SetFilePointer (hIn, bfh.bfOffBits, NULL, FILE_BEGIN);
Ancho = bih.biAncho;

Altura = bih.biAltura;
OffBits = bfh.bfOffBits;
//Asignar memoria

inBuf = nuevo BYTE [Ancho];
outBuf = nuevo RGBTRIPLE [Ancho]; //Completa los encabezados
bfh.bfOffBits = tamaño de (bfh) + tamaño de (bih);
// No escribamos una paleta

bih.biBitCount = 24;
si (hFile == INVALID_HANDLE_VALUE)
bfh.bfSize = bfh.bfOffBits + 4 * Ancho * Alto + Alto * (Ancho% 4);
// Tamaño del archivo

// Y el resto permanece sin cambios
// Escribe la paleta< Height; i++ )
{
WriteFile (hOut, & bfh, tamaño de (bfh), & RW, NULL);
WriteFile(hFile, Paleta, 1024, &RW, NULL);< Width; j++ )
{
WriteFile (hOut, & bih, tamaño de (bih), & RW, NULL);
outBuf[ j].rgbtGreen = Paleta[ inBuf[ j] ] .rgbGreen ;
outBuf[ j].rgbtBlue = Paleta[ inBuf[ j] ] .rgbBlue ;
}
WriteFile (hOut, outBuf, tamaño de (RGBTRIPLE) * Ancho, & RW, NULL);

// Escribe basura para alineación
WriteFile (hOut, Paleta, Ancho % 4, & RW, NULL);
SetFilePointer(hIn, (3 * Ancho) % 4, NULL, FILE_CURRENT);
}

eliminar inBuf;
eliminar outBuf;
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
CloseHandle(hOut);
devolver VERDADERO;
}

Los nombres de los archivos de origen y de destino deben pasarse a la función, respectivamente.

Si lo tienes instalado en tu ordenador programa antivirus Poder escanear todos los archivos en su computadora, así como cada archivo individualmente. Puede escanear cualquier archivo haciendo clic derecho en el archivo y seleccionando la opción adecuada para escanear el archivo en busca de virus.

Por ejemplo, en esta figura se resalta archivo mi-archivo.bmp, luego debe hacer clic derecho en este archivo y seleccionar la opción en el menú de archivo "escanear con AVG". Cuando seleccione esta opción, AVG Antivirus abrirá y analizará el archivo en busca de virus.


A veces puede producirse un error como resultado instalación de software incorrecta, lo que puede deberse a un problema encontrado durante el proceso de instalación. Esto puede interferir con su sistema operativo. vincule su archivo BMP a la herramienta de aplicación correcta, influyendo en el llamado "asociaciones de extensiones de archivos".

A veces simple reinstalar Adobe Illustrator CC puede resolver su problema vinculando BMP correctamente con Adobe Illustrator CC. En otros casos, los problemas con las asociaciones de archivos pueden deberse a mala programación de software desarrollador y es posible que deba comunicarse con el desarrollador para obtener más ayuda.


Consejo: Intente actualizar Adobe Illustrator CC a la última versión para asegurarse de tener las últimas correcciones y actualizaciones.


Esto puede parecer demasiado obvio, pero a menudo El propio archivo BMP puede estar causando el problema. Si recibió un archivo a través de un archivo adjunto de correo electrónico o lo descargó de un sitio web y el proceso de descarga se interrumpió (como un corte de energía u otro motivo), el archivo puede dañarse. Si es posible, intente obtener una nueva copia del archivo BMP e intente abrirlo nuevamente.


Con cuidado: Un archivo dañado puede causar daños colaterales al malware anterior o existente en su PC, por lo que es importante mantener su computadora ejecutando un antivirus actualizado en todo momento.


Si tu archivo es BMP relacionado con el hardware de su computadora para abrir el archivo es posible que necesite actualizar los controladores del dispositivo asociados con este equipo.

este problema generalmente asociado con tipos de archivos multimedia, que dependen de la apertura exitosa del hardware dentro de la computadora, p. tarjeta de sonido o tarjeta de video. Por ejemplo, si está intentando abrir un archivo de audio pero no puede abrirlo, es posible que deba actualizar los controladores de la tarjeta de sonido.


Consejo: Si cuando intentas abrir un archivo BMP recibes Mensaje de error del archivo .SYS, el problema probablemente podría ser asociado con controladores de dispositivos corruptos u obsoletos que es necesario actualizar. Este proceso puede facilitarse utilizando un software de actualización de controladores como DriverDoc.


Si los pasos no resuelven el problema y todavía tienes problemas para abrir archivos BMP, esto podría deberse a falta de recursos del sistema disponibles. Algunas versiones de archivos BMP pueden requerir una cantidad significativa de recursos (por ejemplo, memoria/RAM, potencia de procesamiento) para abrirse correctamente en su computadora. Este problema es bastante común si utiliza hardware informático bastante antiguo y, al mismo tiempo, un sistema operativo mucho más nuevo.

Este problema puede ocurrir cuando la computadora tiene dificultades para seguir el ritmo de una tarea porque el sistema operativo (y otros servicios que se ejecutan en segundo plano) pueden consume demasiados recursos para abrir un archivo BMP. Intente cerrar todas las aplicaciones de su PC antes de abrir el archivo de imagen de mapa de bits. Liberar todos los recursos disponibles en su computadora le brindará las mejores condiciones para intentar abrir su archivo BMP.


Si usted completado todos los pasos descritos anteriormente y su archivo BMP aún no se abre, es posible que deba ejecutar actualización de equipos. En la mayoría de los casos, incluso cuando se utilizan versiones anteriores de hardware, la potencia de procesamiento puede ser más que suficiente para la mayoría de las aplicaciones de usuario (a menos que esté realizando mucho trabajo con uso intensivo de la CPU, como renderizado 3D, modelado científico/financiero o trabajo multimedia intensivo). De este modo, es probable que tu computadora no tenga suficiente memoria(comúnmente llamada "RAM" o memoria de acceso aleatorio) para realizar la tarea de abrir un archivo.




Arriba