Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Leer BMP en estructura RGB

Estas en el tema de Leer BMP en estructura RGB en el foro de C/C++ en Foros del Web. Hola, quisiera pedirles el favor de que me ayudaran con esto. Estoy realizando un código para optica adaptativa, para ello he creado una clase Pixel ...
  #1 (permalink)  
Antiguo 27/04/2012, 05:52
 
Fecha de Ingreso: abril-2012
Mensajes: 1
Antigüedad: 12 años
Puntos: 0
Leer BMP en estructura RGB

Hola, quisiera pedirles el favor de que me ayudaran con esto. Estoy realizando un código para optica adaptativa, para ello he creado una clase Pixel tal que:

Código:
class Pixel
{
    public:
    short int red;
    short int green;
    short int blue;
};
Mi unica dificultad es el leer un bmp cualquiera y asociarlo a un array de objetos Pixel, ya que un bmp tiene una estructura que es del mismo tipo que mi clase pixel (RGB). Fuente: http://en.wikipedia.org/wiki/BMP_file_format

Lo que el codigo debe devolver por pantalla son 4 columnas de hexadecimales del tipo:

00 00 FF
FA 00 FF
80 0A 00
...
...
Pasando estos hexadecimales a decimales cada columna son numeros comprendidos entre 0 y 256.

Tambien existe un problema con el encabezado del bmp, pero creo que si obtuviese esas columnas de hexadecimales podria resolverlo. Mi unico problema es por tanto obtener esas columas de numeros.

He probado con codigos del tipo:
Código:
#include<iostream>
#include <fstream>
using namespace std;


int main(){
	char v[100];
    ifstream entrada;
	entrada.open("m64.bmp",ios::binary);
    if(!entrada.fail()){
        for(int i=0; i<100; i++)
			entrada >> v[i];
		for(int j=0; j<2; j++)
			cout << v[j];
		entrada.close();
    }
    else cout << "No puedo abrir el archivo Dibujo.bmp"<<endl;
	cin.get();
	return 0;
}
Pero no consigo el resultado que quiero, o bien me sale un "BM" o bien me salen codigos sin sentido. Si puediesen ayudarme les estaria agradecidos, ya que mi formacion es de fisico y no estoy preparado para realizar esto, pero es necesario en este momento para mi.

Muchas Gracias
  #2 (permalink)  
Antiguo 30/04/2012, 13:17
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Leer BMP en estructura RGB

Un archivo de imagen, en formato BMP, tiene una cabecera que contiene la información acerca de la imagen (tamaño, colores, etc), seguida de los valores de la imagen, pixel a pixel. La estructura de esta cabecera es:

Cabecera (14 bytes):
Firma (2 bytes) Siempre 'BM'
Tamaño del archivo (4 bytes) Tamaño del archivo, en bytes
Reservado (4 bytes) Siempre cero
Offset de datos (4 bytes) Offset a comienzo de datos

Cabecera de información (40 bytes)
Tamaño (4 bytes) Tamaño de la cabecera de información
Anchura (4 bytes) Anchura del bitmap en pixels
Altura (4 bytes) Altura del bitmap en pixels
Planos (2 bytes) Número de planos (siempre 1)
Bits por pixel (2 bytes) Valores válidos: 1, 2, 4, 8, 24, 32
Compresión (4 bytes) Tipo de compresión (0 = No)
Tamaño de imagen (4 bytes) Tamaño de la imagen (comprimida en su caso)
X-pixels (4 bytes) Resolución horizontal
Y-pixels (4 bytes) Resolución vertical
Colores usados (4 bytes) Número de colores utilizados
Colores importantes (4 bytes) Número de colores importantes (0 = todos)

Tabla de colores (4*NumColores bytes)
Sólo habrá tabla de colores si BitsPorPixel<=8, si es 24 ó 32 no hay tabla de colores y se pasa directamente a los datos.

Rojo 1 byte
Verde 1 byte
Azul 1 byte
Reservado 1 byte (siempre cero)
(esto se repetiría NumColores veces)

Datos (Tamaño_de_imagen bytes)

(confírmalo buscando en Internet). Los datos de la imagen vienen por orden, aunque en este momento no recuerdo si comienza por la esquina superior izquierda o inferior izquierda.

Si la imagen se guardó con 24 bits de color, para cada pixel tendrás 3 bytes, uno para rojo (R), otro para verde (G) y otro para azul (B), de este modo:

RRGGBB RRGGBB RRGGBB (etc)

(bueno, no recuerdo si aparecen así o aparecen BBGGRR) donde cada secuencia RRGGBB representa 1 pixel.

Si la imagen se guardó con 32 bits de color, a cada pixel le corresponde un entero de 32 bits (4 bytes). El número de colores es el mismo, simplemente se guarda un byte adicional que es siempre cero. En los cuatro bytes de ese entero (que corresponde a un pixel) vas a tener

00 RR GG BB

(aquí sí estoy seguro del orden), es decir, el primer byte es siempre 0, el segundo corresponde al rojo, el tercero al verde y el último al azul.

Convendría que te hicieras con un editor hexadecimal y que abrieras con él el archivo de imagen, así podrás ver "de primera mano" la cabecera del archivo y los datos, esto te ayudará.

Un último detalle si utilizas el editor hexadecimal o tu programa va a leer el archivo byte por byte: Los procesadores INTEL guardan los números (sean del tipo que sean) comenzando por el byte menos significativo (se denomina formato little-endian), por ejemplo, el entero que me guarda la información del pixel, que sería 00 RR GG BB, estará almacenado como BB GG RR 00 (lo puedes ver con el editor hexadecimal).

Como puedes ver ese "BM" corresponde a la "firma" del archivo.

Espero que esta descripción de la cabecera del archivo BMP te oriente.

Saludos,

Etiquetas: bmp, estructura, int, rgb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:20.