PDA

View Full Version : loading raw image



crista
03-18-2003, 02:30 AM
I have a problem loading a raw image and I donīt know what happen with my code. It seems to be good, it loads the image but only appears a colour similar to the real image. What can I do???

#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glut.h>
#include <stdio.h>

GLuint texture[1];

typedef struct Texture_Image
{
int width;
int height;
int format;
unsigned char *data;
} TEXTURE_IMAGE;

typedef TEXTURE_IMAGE *P_TEXTURE_IMAGE;

P_TEXTURE_IMAGE t1;


P_TEXTURE_IMAGE AllocateTextureBuffer(GLint w, GLint h, GLint f)
{
P_TEXTURE_IMAGE ti=NULL;
unsigned char *c=NULL;

ti = (P_TEXTURE_IMAGE)malloc(sizeof(TEXTURE_IMAGE));

if (ti != NULL) {
ti->width = w;
ti->height = h;
ti->format = f;

c = (unsigned char *)malloc(w * h * f);

if (c != NULL) {
ti->data = c;
}
else {
printf("error");
return NULL;
}
}
else
{
printf("error");
return NULL;
}
return ti;
}

void DeallocateTexture(P_TEXTURE_IMAGE t)
{
if(t)
{
if(t->data)
{
free(t->data);
}
free(t);
}
}


int ReadTextureData (char *filename, P_TEXTURE_IMAGE buffer)
{
FILE *f;
int i, j, k, done = 0;
int stride = buffer->width * buffer->format;
unsigned char *p = NULL;

f = fopen(filename, "rb");
if (f !=NULL)
{
for (i = buffer->height-1; i>=0; i--)
{
p = buffer->data + (i * stride);
for (j = 0; j < buffer->width; j++)
{
for (k = 0; k < buffer->format-1; k++, p++, done++)
{
*p = fgetc(f);
}
*p = 255; p++;
}
}
fclose(f);
}
else
{
printf("name error\n");
}
return done;
}


void BuildTexture (P_TEXTURE_IMAGE tex)
{
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex->width, tex->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex->data);
}


int InitGL(GLvoid)
{
t1 = AllocateTextureBuffer(256, 256, 4);
if (ReadTextureData("prueba.raw", t1) == 0)
{
printf("error\n");
return FALSE;
}

BuildTexture (t1);

DeallocateTexture (t1);

glEnable(GL_TEXTURE_2D);

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

return TRUE;
}


GLvoid DrawGLScene (GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);

glBindTexture(GL_TEXTURE_2D, texture[0]);

glBegin(GL_QUADS);
glTexCoord2f(1.0, 1.0);glVertex3f( 2, 2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( 2, -2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( -2, -2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( -2, 2, 0.0);
glEnd();

glutSwapBuffers();
glutPostRedisplay();
}


int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(350, 200);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);

glutCreateWindow("RAW");

InitGL();
glutDisplayFunc(DrawGLScene);
glutMainLoop();
return 0;
}

morbac
03-18-2003, 03:18 AM
Why do you read all pixel in sequence when loading the RAW. You can directly read a whole line and put it in your buffer. I wrote a RAW loader and did so :

// Load data
GLubyte* tmp = new GLubyte[4*w*h];
memset(tmp, 0, 4*w*h*sizeof(GLubyte));
fp = fopen(name, "rb");
for (int i = 0; i < 4*w*h; i+=4)
{
fread(&tmp[i], sizeof(GLubyte), 3, fp);
tmp[i+3] = 255;
}
fclose(fp);

// Invert texture
GLubyte* data= new GLubyte[4*w*h];
memset(data, 0, 4*w*h*sizeof(GLubyte));
for (i = 0; i < h; ++i)
{
memcpy(&data[4*w*(h-i-1)], &tmp[4*w*i], 4*w);
}

delete [] tmp;

Now for your problem, it is certainly due to the texture coordinates you define in the DrawGLScene() : all vertices of the quad have the same texture coordinate.

crista
03-18-2003, 04:07 AM
Thank's for your reply!!! I have my raw image loaded.


Originally posted by morbac:
Why do you read all pixel in sequence when loading the RAW. You can directly read a whole line and put it in your buffer. I wrote a RAW loader and did so :

// Load data
GLubyte* tmp = new GLubyte[4*w*h];
memset(tmp, 0, 4*w*h*sizeof(GLubyte));
fp = fopen(name, "rb");
for (int i = 0; i < 4*w*h; i+=4)
{
fread(&tmp[i], sizeof(GLubyte), 3, fp);
tmp[i+3] = 255;
}
fclose(fp);

// Invert texture
GLubyte* data= new GLubyte[4*w*h];
memset(data, 0, 4*w*h*sizeof(GLubyte));
for (i = 0; i < h; ++i)
{
memcpy(&data[4*w*(h-i-1)], &tmp[4*w*i], 4*w);
}

delete [] tmp;

Now for your problem, it is certainly due to the texture coordinates you define in the DrawGLScene() : all vertices of the quad have the same texture coordinate.