Programación General > C/C++
Leer bmp y convertirlo a matriz
(1/1)
javili:
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++ ---class Pixel{ public: short int red; short int green; short int blue;};
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 -:
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
javili:
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++ ---#include <iostream>#include <fstream> using namespace std; int main(){ char c[100]; ifstream fich; fich.open("m64.bmp",ios::binary); while(!fich.eof()){ fich>>c; cout<<c; } fich.close();}
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 -:
--- Citar ---Tambien si podriais decirme como obviar la cabecera para que solo obtenga los valores de los colores de la imagen bmp del pixel.
--- Fin de la cita ---
--- Código: C++ ---fichero.seekg(0, ios::end); // Nos aseguramos de que estemos al inicio del ficheromyfile.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++ --- // Esto dentro de un try catch.Image img("C:/path_imagen.bmp");ColorRGB rgb(img.pixelColor(0, 0)); // Leer el color en el pixel 0,0cout << "red: " << rgb.red() << endl; // Imprimir valores del rojocout << "green: " << rgb.green() << endl; cout << "blue: " << rgb.blue() << endl;
Me gustaria ayudarte mas pero no se C++.
luchojimenez:
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
Navegación
Ir a la versión completa