• Viernes 8 de Noviembre de 2024, 17:33

Autor Tema:  Leer bmp y convertirlo a matriz  (Leído 9938 veces)

javili

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Leer bmp y convertirlo a matriz
« en: Martes 24 de Abril de 2012, 17:00 »
0
Hola, antes que nada enhorabuena por el foro ya que recién ingreso.

Quisiera hacerles una consulta acerca de un código que estoy creando para un proyecto de optica adaptativa.

He creado una classe pixel tal que:

Código: C++
  1. class Pixel
  2. {
  3.     public:
  4.     short int red;
  5.     short int green;
  6.     short int blue;
  7. };
  8.  

Lo que representa la estructura del color de un pixel en RGB siendo números enteros de 0 a 255, por lo que una imagen no será mas que un array de esos objetos "Pixel".
Lo que pretendo es cargar una imagen BMP mediante "fstream" para copiarlo a un array de objetos Pixel (que tiene la misma estructura que las imagenes BMP segun he visto en wiki: http://en.wikipedia.org/wiki/BMP_file_format). Y he visto que existe una cabecera que no se como tratar, ni como obtener la información que está cifrada en el BMP para poder manejarla y copiarla al array de objetos Pixel.
Si es posible no usar punteros, ni nada complicado mejor, ya que mi formación es de físico y mis conocimientos en programación son básicos, solo llego a usar clases y transferencia de archivos por fstream.

Si pudieran ayudarme se lo agradecería. Muchas Gracias.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re:Leer bmp y convertirlo a matriz
« Respuesta #1 en: Miércoles 25 de Abril de 2012, 04:22 »
0
Pero quien usa BMP en la actualidad? :mellow:

Bueno, la solucion mas facil seria usar Magick++ la API de ImageMagick para C++. Te permite usar un numero de formatos de imagen que ni te imaginas, locales o web y permite editar, aplicar filtro o simplemente leer todo lo referente a una imagen. Si en el proyecto te permiten usar librerias externas, esta es la mejor solucion o al menos la mas comoda.

Si tienes que reinventar la rueda, tienes que abrir el fichero en forma binaria y sengun las especificaciones del formato ir leyendo e interpretando.
Aqui puedes ver como leer un fichero en binario
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

javili

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:Leer bmp y convertirlo a matriz
« Respuesta #2 en: Miércoles 25 de Abril de 2012, 18:47 »
0
Tengo que usar bmp porque necesito imagenes sin comprimir, basicamente imagenes tomadas de observatorios astronomicos, que tienen la maxima calidad y con la estructura tipo RGB. He intentado probar y comprender el enlace que me has dejado pero no consigo ningun resultado al intentar leer el bmp en esa forma. Lo que he intentado es lo siguiente:

Código: C++
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     char c[100];
  9.     ifstream fich;
  10.  
  11.     fich.open("m64.bmp",ios::binary);
  12.  
  13.     while(!fich.eof()){
  14.         fich>>c;
  15.         cout<<c;
  16.     }
  17.     fich.close();
  18. }
  19.  
  20.  

El resultado son codigos ilegibles:
======<<<;;;:::99900000///////11... y cosas por el estilo. Este codigo es solo una prueba para ver lo que me da de salida el codigo segun esos parametros en fstream.

El resultado que espero es el que viene en la wiki:

                                       red    green   blue  alpha
FF 00 00 7F    que significa:  255    0         0      127     //tras pasarlo a decimal
00 FF 00 7F    que significa:    0     255      0      127
...

Esto es la estructura RGB y un numero adicional "alpha", obteniendo este resultado podria asociar a cada valor de la columna a mi Pixel[i,j].red, Pixel[i,j].green, Pixel[i,j].blue a cada Pixel de mi array, y asi obtener un array de objetos Pixel con toda la informacion del bmp.

Mi pregunta es en que forma, o que parametros tengo que aplicar a fstream para obtener esa codificacion.

Tambien si podriais decirme como obviar la cabecera para que solo obtenga los valores de los colores de la imagen bmp del pixel.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re:Leer bmp y convertirlo a matriz
« Respuesta #3 en: Jueves 26 de Abril de 2012, 17:27 »
0
Citar
Tambien si podriais decirme como obviar la cabecera para que solo obtenga los valores de los colores de la imagen bmp del pixel.
Código: C++
  1. fichero.seekg(0, ios::end); // Nos aseguramos de que estemos al inicio del fichero
  2. myfile.seekg(bytes_a_saltar, ios::cur);
El problema es que el header, segun entiendo, no tiene un tamaño estatico (depende de la version y el programa que lo genera) por eso te recomiendo usar Magick++ que lee todo lo que necesitas y es tan simple como hacer esto:
Código: C++
  1.  // Esto dentro de un try catch.
  2. Image img("C:/path_imagen.bmp");
  3. ColorRGB rgb(img.pixelColor(0, 0)); // Leer el color en el pixel 0,0
  4. cout << "red: " << rgb.red() << endl; // Imprimir valores del rojo
  5. cout << "green: " << rgb.green() << endl;
  6. cout << "blue: " << rgb.blue() << endl;
  7.  

Me gustaria ayudarte mas pero no se C++.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

luchojimenez

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re:Leer bmp y convertirlo a matriz
« Respuesta #4 en: Viernes 22 de Junio de 2012, 21:14 »
0
interesante proyecto yo tambien en un tiempo  me revente la cabeza con eso , pero   pregunto si es absolutamente nesesario hacerlo  en c++   porque en matlab es muy facil hacerlo,existen comandos que te cargan imagenes  en matriz de arrays  a las cuales les puedes hacer cualquier  modificacion de los arrays y aplicarle convoluciones  que vienen  por defecto con  matlab, la otra  seria trabajar con una libreria  como opengl o direct x  que  traen muchas opciones para  trabajar y manipular graficos