El Formato BMP y como leerlo
Formato BMP
En la actualidad existen en el mercado diversos tipos de formatos para almacenar imágenes, su diversidad es muy grande. Algunos de los formatos mas populares son GIF, TIFF, JPG, BMP, etc.
Todos estos formatos son comerciales por lo cual no es fácil encontrar información interna sobre ellos.
Uno de los formatos mas sencillos es el BMP (Mapa de Bits). Un BMP como todo archivo con formato consta de dos partes primordiales.
cabecera y cuerpo.
La cabecera esta compuesta de: la identificación del formato del archivo, dirección de inicio del cuerpo, tamaño horizontal de la imagen, tamaño vertical de la imagen,el numero de bits por píxel y la paleta de colores.
Con la información de la cabecera obtenemos el tamaño de imagen. el tipo de resolución del archivo (si es de 2, 16 o 256 colores), y la paleta de colores propia de esa imagen.
En el cuerpo de la imagen se encuentra el valor del color de cada píxel, que se ira acomodando en la posición correspondiente de acuerdo al tamaño de horizontal y vertical, podemos pensar en algún momento que la imagen esta guardada de arriba hacia abajo lo cual es falso.
El primer píxel del cuerpo corresponde a la parte inferior izquierda de la imagen, los demás píxeles se irán acomodando de izquierda a derecha y de abajo hacia arriba.
La ubicación de la información dentro del archivo es la siguiente:
| BYTE | SIGNIFICADO |
| 0 | Identificación del archivo. |
| 10 | Lugar donde empieza el cuerpo. CUERPO |
| 18 | Tamaño horizontal. TAM_X |
| 22 | Tamaño vertical. TAM_Y |
| 28 | Bits por pixel. BIT_PIXEL |
| 30 | Principio de la paleta de colores. PALETA |
| XX | El principio del cuerpo se calcula por medio de los bits por pixel y la paleta decolores. |
La paleta de colores es una tabla donde se tienen los colores de la imagen, cada color esta formado de 4 componentes R, G, B, A donde R, G, B, indican la cantidad de rojo, verde y azul de cada color, A es una mascara que nos indica como se combinará ese color con los demás. Hay Que tener cuidado ya que la paleta decolores esta escrita en el orden de B, G, R, A.
A continuación se muestra un pequeño programa que despliega archivo con formatoBMP en la pantalla de la PC.
// Programa que despliega una imagen con formato BMP // Realizado por: J. Antonio Jiménez Aviña //Cabeceras #include <conio.h> #include <stdio.h> #include <graphics.h> FILE * BMP; //Declaración de variables long int BIT_PIXEL, PIXEL_BIT,CUERPO, PALETA, PALETA_TAM, TAM_X, TAM_Y; typedef struct //Estructura para el color { unsigned char b, g, r, a; } Color; int getcol (void); int ShowBMP (char *fname); void main (void) { int gdriver = DETECT, gmode; initgraph (&gdriver, &gmode, ""); //poner el nombre del archivo donde esta la imagen a desplegar ShowBMP ("ARCHIVO.BMP"); getch (); closegraph (); } int ShowBMP (char *fname) //Función que abre el archivo y despliega la imagen en el monitor { int color; int k, c; Color col; int x, y; BMP = fopen (fname, "rb"); if (BMP == NULL) return 1; fseek (BMP, 10, SEEK_SET); //Lectura de la cabecera fread (&CUERPO, sizeof (CUERPO), 1, BMP); fseek (BMP, 18, SEEK_SET); fread (&TAM_X, sizeof (TAM_X), 1, BMP); fseek (BMP, 22, SEEK_SET); fread (&TAM_Y, sizeof (TAM_Y), 1, BMP); fseek (BMP, 28, SEEK_SET); fread (&BIT_PIXEL, sizeof (BIT_PIXEL), 1, BMP); PIXEL_BIT = 8 / BIT_PIXEL; PALETA_TAM = 1 << BIT_PIXEL; PALETA = CUERPO - 4 * PALETA_TAM; fseek (BMP, PALETA, SEEK_SET); for (k = 0; k < PALETA_TAM; k++) //Cargando la paleta de colores { fread (&col, sizeof (col), 1, BMP); setrgbpalette (k, (col.r) >> 2, (col.g) >> 2, (col.b) >> 2); } for (y = TAM_Y - 1; y >= 0; y--) //Despliega la imagen en el for (x = 0; x < TAM_X; x++) //monitor putpixel (x, y, getcol ()); return 0; } int getcol (void) //Función que regresa el color { //del pixel de acuerdo a sus componentes RGB static int x = 0; static int n = 0; static long int col[4]; unsigned char b; if (x >= TAM_X) { x = 0; while (n % 4) { fread (&b, sizeof (b), 1, BMP); n++; } n = 0; } if (x % PIXEL_BIT == 0) { int k = PIXEL_BIT; int mask = (1 << BIT_PIXEL) - 1; fread (&b, sizeof (b), 1, BMP); n++; while (k--) { col[k] = b & mask; b >>= BIT_PIXEL; } } return col[x++ % PIXEL_BIT]; }
Quizá te interese :
#include #include char bufer[500]; typedef struct swav { char Riff[4]; long longRi ...
Eres libre para utilizar estas rutinas y si lo deseas poner un link hacia www.ubicuos.com. Da ...
#include #include #include void cifrar (char *archivo, char *llave); void descifrar (ch ...









HOLA, ESTABA PROBANDO SU PROGRAMA Y NO ME FUNCIONA, QUE CREE QUE PUEDE SER.? GRACIAS
Hola Susy
El programa es para BorlandC++ 3.1 para DOS, si nos indicas que problemas tuviste es mucho más fácil ayudarte, no dudes en preguntar nuevamente.
Este programa lo probe en C linux, y no funciono, marca errores.
El programa no está para Linux, es para BorlandC, para DOS, si necesitas usar Linux, una alternativa es usar la biblioteca SDL, que tiene funciones especializadas en gráficos, sin llegar a ser demasiado complejas como Qt o GTK+
Hola que tal, baje el codigo y lo probe y funciona pero modifica los colores de las imagenes orifinal y los torna a otra escala (amarillo), ya revise la paleta de colores y esta bien, modifique la funcion getcol e igual no funciona, no se porque me modifica los colores de la imagen, si pudieras ayudarme, Gracias,….!!!!
Tiene que ver con el adaptador de colores (si lo estás viendo con los adaptadores normales se modifica el color), también tienen que ser imágenes en 256 (o menos) colores para no tener tanta distorsión.
Eso pense pero lo he provado con aceleradores de graficoss y pues no pasa nada, es lo mismo, si uso menos a 256 y los unicos que saca bien son monocromaticos (ovbiamente),……..
Hola, estoy buscando un programa en C, para leer y depus transmitir un archivo BMP por puerto paralelo a un circutio de 8 leds donde moviendo los leds se va formando la imagen. Este es un proyecto logre hacerlo pero solo para q se vean letras! estaba viendo el tema de archivos BMP, seria muy bueno si tiene o sabe algo de como pasar un archivo bmp en blanco y negro nada mas y transmitir por puerto paralelo, cualquier cosa es de gran ayuda! no hay mucha informacion sobre esas cosas! desde ya muchas gracias
Hola, estoy buscando un programa en C, para leer y depus transmitir un archivo BMP por puerto paralelo a un circutio de 8 leds donde moviendo los leds se va formando la imagen. Este es un proyecto logre hacerlo pero solo para q se vean letras! estaba viendo el tema de archivos BMP, seria muy bueno si tiene o sabe algo de como pasar un archivo bmp en blanco y negro nada mas y transmitir por puerto paralelo, cualquier cosa es de gran ayuda! no hay mucha informacion sobre esas cosas! desde ya muchas gracias