Cargar y mostrar image BMP c++

Iniciado por razormta, 27 Febrero 2014, 01:35 AM

0 Miembros y 1 Visitante están viendo este tema.

razormta

¿ Que ven mal en mi codigo ?
Es que me muestra un cuadro gris pero no carga la textura .... no entiendo porque
Estoy algo desesperado y puede que este pasando algo por alto, si alguien ve algo malo digame T_T

PD: empeze a hacerlo hace unas horas y no he estudiado mucho con respecto al manejo de BMP's, tal ves ese sea mi problema

Código (cpp) [Seleccionar]


bool SPRITE::LoadBMP(const char * path, GLuint * texture)
{
std::ifstream img(path, std::ios::binary);
if( !img )
return(False);

BITMAPFILEHEADER imgHeader;
BITMAPINFOHEADER imgInfo;

img.read( (char*)&imgHeader,sizeof(BITMAPFILEHEADER) );
img.read( (char*)&imgInfo, sizeof( BITMAPINFOHEADER ) );

if (imgHeader.bfType != 0x4D42)
return(False);

int size = ( imgInfo.biSizeImage );

BYTE * pix =new BYTE[size];
img.read( (char*)pix, size );

img.close();

BYTE * data = new BYTE[size];
for (int i = 0; i < size; i += 3)
{
data[i+0] = pix[i+2];
data[i+1] = pix[i+1];
data[i+2] = pix[i+0];;
}

unsigned int w = imgInfo.biWidth;
unsigned int h = imgInfo.biHeight;

glGenTextures(1, texture);           
glBindTexture(GL_TEXTURE_2D, *texture);           

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glBindTexture(GL_TEXTURE_2D, NULL);

return(True);
}


razormta

Resolver problemas es mi mayor adiccion, ya lo resolvi... pff ... punteros xd , de todas maneras deberia borrar el post no ?, haha ... no me hace falta un foro lml okno xd

engel lex

no, no se borra :P coloca tu solucion... por si alguien se enfrenta a eso luego... o de todas formas queda como un aporte
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

razormta

Haciendo caso al chico de arriba, aca mi solucion, primero estudiar a fondo como funcionan las BMP's, todo acerca de el padding y aprender la diferencia de imagenes de 8 bits, 16 bits , 24 bits etc ...

Por ahora mi programa trabaja con imagenes bmp de 24 bits, pero me animare para hacerlo de todos los formatos posibles, algo asi como freeimage xd

Código (cpp) [Seleccionar]

bool SPRITE::LoadBMP(const char * path, GLuint * texture)
{
/**/
std::ifstream img(path, std::ios::binary);
if( !img )
return(False);
/**/
BITMAPINFOHEADER imgHeader;
BITMAPFILEHEADER imgInfo;
img.read( (char*)&imgHeader,sizeof(BITMAPFILEHEADER) );
img.read( (char*)&imgInfo, sizeof( BITMAPINFOHEADER ) );
/**/
if (imgHeader.bfType != 0x4D42)
{
img.close();
return(False);
}
/**/
int W =  imgInfo.biWidth;
int w = 4* ( ( W * 24 + 31 ) /32 );
int h = imgInfo.biHeight;
int size = abs(w*h);
/**/
BYTE * pix = new BYTE[size];
img.seekg(imgHeader.bfOffBits);
img.read( (char*)pix, size );
/**/
BYTE * data = new BYTE[size];
bool done = true;

switch(imgInfo.biBitCount)
{
case 24:
BMP_24_TO_24( pix, data, (W*h) );
}
/**/
if( done )
{
glGenTextures(1, texture);           
glBindTexture(GL_TEXTURE_2D, *texture);           

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0,  GL_RGB, W, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glBindTexture(GL_TEXTURE_2D, NULL);
}
/**/
delete[] pix;
delete[] data;
/**/
return(True);
}


Es probable que la funcion no sea muy elegante , pero deben tener en cuenta que lo que se de programacion lo aprendi de ejemplos y no de manuales xd

Código (cpp) [Seleccionar]

void SPRITE::BMP_24_TO_24( BYTE * data, BYTE * new_data, int Size )
{
int index = 0;
do
{
new_data[(index*3)+0] = data[(index*3)+2];
new_data[(index*3)+1] = data[(index*3)+1];
new_data[(index*3)+2] = data[(index*3)+0];
index++;
}while( index < Size );
}


Mmmm, para mostrar una imagen de 8 bits, primero la transformare a 24 bits y luego llamare a la funcion BMP_24_TO_24, pero eso me tomara un tiempo, hasta ahora tnego solo esto xd