Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/11/2011, 02:54
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Duda importante C++

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 puedes encontrarla en Internet. Siguiendo a esta cabecera, vienen los datos de la imagen por orden, aunque 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. Puedes tratarlos como una matriz de enteros, o puedes obtener tres matrices de bytes, una por color.

Sobre el formato JPG, este lleva algo de compresión, es cuestión de buscar la estructura del archivo y cómo se hace la compresión y descompresión. Una vez restaurada la imagen puedes obtener una o varias matrices de pixels, como las citadas arriba.

Sobre el tema de decidir si la foto se tomó de día o de noche, piensa que si fué de noche lo más probable es que las líneas de pixeles de la parte superior estarán muy oscuras (valores muy bajos de las tres componentes de color), mientras que si fué de día tendrás valores altos de azul y/o verde (no necesariamente de rojo), y si estaba nublado tendrás valores similares de los tres colores (los grises se forman con las tres componentes de color iguales). Incluso, si la componente de rojo es relativamente elevada frente a las de azul y/o verde, puedes pensar que la foto se tomó al amanecer o atardecer.

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).

Saludos,