#define MAXWIDTH 400
#define MAXHEIGHT 400
struct BITMAPFILEHEADER{
//bfType 2bytes
int bfSize;
//bfReserved1
//bfReserved2
int bfOffBits;
};
struct BITMAPINFOHEADER{
int biSize; //tamaño de esta estructura
int biWidth; //ancho en pixels
int biHeight; // alto en pixels
//biPlanes 2bytes must be zero
//biBitCount 2bytes nº de bytes per pixel
int biCompression; //tipo de compresion, 0= no compresion
int biSizeImage; //tamaño de la imagen, sin compresion = 0
int biXPelsPerMeter; //specifies the the horizontal pixels per meter on the
//designated targer device, usually set to zero
int biYPelsPerMeter;//specifies the the vertical pixels per meter on the
//designated targer device, usually set to zero.
int biClrUsed;//specifies the number of colors used in the bitmap, if set to
//zero the number of colors is calculated using the biBitCount member.
int biClrImportant;//specifies the number of color that are 'important' for the bitmap,
// if set to zero, all colors are important
};
/*****************************************
Struct pixel: tres componentes RGB
Su lectura se realiza al reves: BGR
y se leen del fichero sobre un char
para cuadrar con el Byte q ocupa cada una
******************************************/
struct Pixel{
int R,G,B;
};
/*********************************************
clase BitMap
Almacena el fichero bmp para el pathfinding
Dos estructuras básicas y la image data
**********************************************/
class BitMap{
public:
void loadFile(char* cad);
void ParseFile(void);
private:
struct BITMAPFILEHEADER fileHeader;
struct BITMAPINFOHEADER infoHeader;
FILE* fichero;
Pixel Data[MAXWIDTH][MAXHEIGHT];
};
/*****************************************
Abre el fichero a partir de la ruta a éste
******************************************/
void BitMap::loadFile(char* cad){
if(!(fichero= fopen(cad, "rb"))) printf("\nfichero no abierto");
};
/***************************************************************
Rellena las estructuras
La Informacion de cada Pixel se almacena en un array de
!!Importante!!
La image data está al reves
Boca-abajo
****************************************************************/
void BitMap::ParseFile(void){
//Nos colocamos en la primera posicion
fseek(fichero, 0, 0);
///rellenamos la estructura fileHeader
//despreciamos algunas lecturas usando char c
char c;
//bfType 2bytes
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
// bfsize
fread( &fileHeader.bfSize, 4, 1, fichero);
printf("\n%d", fileHeader.bfSize);
//bfReserved1 y 2
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
//bfOffBits
fread( &fileHeader.bfOffBits, 4, 1, fichero);
printf("\n%d", fileHeader.bfOffBits);
///rellenamos la estructura infoHeader
//biSize
fread( &infoHeader.biSize, 4, 1, fichero);
printf("\n%d", infoHeader.biSize);
//biWidth
fread( &infoHeader.biWidth, 4, 1, fichero);
printf("\n%d", infoHeader.biWidth);
//biHeigth
fread( &infoHeader.biHeight, 4, 1, fichero);
printf("\n%d", infoHeader.biHeight);
//biPlanes y biBitCount
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
fread(&c, 1,1, fichero);
//biCompression
fread( &infoHeader.biCompression, 4, 1, fichero);
printf("\n%d", infoHeader.biCompression);
//biSizeImage
fread( &infoHeader.biSizeImage, 4, 1, fichero);
printf("\n%d", infoHeader.biSizeImage);
printf("\n%d\n", ftell(fichero));
///Omitimos el resto de lecturas por ser inecesarias para nuestra tarea
///Lectura del Image Data
fseek(fichero, fileHeader.bfOffBits, 0); //nos colocamos donde empieza
int x=0;
int y=0;
while( !feof(fichero))
{
fread( &c, 1, 1, fichero);
if(c<0) Data[x][y].B= 256+c; else Data[x][y].B= c;
fread( &c, 1, 1, fichero);
if(c<0) Data[x][y].G= 256+c; else Data[x][y].G= c;
fread( &c, 1, 1, fichero);
if(c<0) Data[x][y].R= 256+c; else Data[x][y].R= c;
printf("\npixel= R(%d),G(%d),B(%d)", Data[x][y].R, Data[x][y].G, Data[x][y].B);
x++;
//si alcanzamos el final de la linea
if(x>= infoHeader.biWidth)
{
x=0; y++; //saltamos a la siguiente
}
}
};