Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 4 of 4

Thread: Loading existing BMP image, drawing onto it, save it back again.

  1. #1
    Newbie Newbie
    Join Date
    Jun 2017
    Posts
    2

    Loading existing BMP image, drawing onto it, save it back again.

    I might need your help guys, cant figure it out.
    so i'll try to explain shortly what i need to do.

    writing a program in C:
    1. Load existing BMP image
    2. Draw line onto it
    3. Save it

    im stuck at 1st part, for some reason the window is completely black without the desired image.
    any help would be appriciated.


    Code :
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>	
    #include <math.h>	
    #include <string.h> 
     
     
    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>         /* glut.h includes gl.h and glu.h*/
    #endif
     
    GLuint texture;
     
    GLuint loadBMP_custom(const char * imagepath)
    {
    	// Data read from the header of the BMP file
    	unsigned char header[54]; // Each BMP file begins by a 54-bytes header
    	unsigned int dataPos;     // Position in the file where the actual data begins
    	unsigned int width, height;
    	unsigned int imageSize;   // = width*height*3
    							  // Actual RGB data
    	unsigned char * data;
     
    	// Open the file
    	FILE * file = fopen(imagepath, "rb");
    	if (!file) { printf("Image could not be opened\n"); return 0; }
     
    	if (fread(header, 1, 54, file) != 54) { // If not 54 bytes read : problem
    		printf("Not a correct BMP file\n");
    		return 0;
    	}
     
    	if (header[0] != 'B' || header[1] != 'M') {
    		printf("Not a correct BMP file\n");
    		return 0;
    	}
     
    	// Read ints from the byte array
    	dataPos = *(int*)&(header[0x0A]);
    	imageSize = *(int*)&(header[0x22]);
    	width = *(int*)&(header[0x12]);
    	height = *(int*)&(header[0x16]);
     
    	// Some BMP files are misformatted, guess missing information
    	if (imageSize == 0)    imageSize = width*height * 3; // 3 : one byte for each Red, Green and Blue component
    	if (dataPos == 0)      dataPos = 54; // The BMP header is done that way
     
    										 // Create a buffer
    	data =(unsigned char*)malloc(sizeof(unsigned char)*imageSize);
     
    	// Read the actual data from the file into the buffer
    	fread(data, 1, imageSize, file);
     
    	//Everything is in memory now, the file can be closed
    	fclose(file);
     
    	// Create one OpenGL texture
    	GLuint textureID;
    	glGenTextures(1, &textureID);
     
    	// "Bind" the newly created texture : all future texture functions will modify this texture
    	glBindTexture(GL_TEXTURE_2D, textureID);
     
    	// Give the image to OpenGL
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
     
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    	return textureID;
    }
     
     
    void display(void) {
     
    	glClearColor(0.0, 0.0, 0.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT);
    	glLoadIdentity();
    	glEnable(GL_TEXTURE_2D);
     
    	glBindTexture(GL_TEXTURE_2D, texture);
     
    	glBegin(GL_QUADS);
    	glTexCoord2d(0.0, 0.0); glVertex2d(0.0, 0.0);
    	glTexCoord2d(1.0, 0.0); glVertex2d(1024.0, 0.0);
    	glTexCoord2d(1.0, 1.0); glVertex2d(1024.0, 512.0);
    	glTexCoord2d(0.0, 1.0); glVertex2d(0.0, 512.0);
    	glEnd();
     
    	glutSwapBuffers();
     
    }
    void reshape(int w, int h) {
    	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    	glMatrixMode(GL_MODELVIEW);
    }
    int main(int argc, char **argv)
    {
     
    	glutInit(&argc, argv);
     
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    	glutInitWindowSize(1024, 512);
    	glutInitWindowPosition(100, 100);
    	glutCreateWindow("A basic OpenGL Window");
    	glutDisplayFunc(display);
    	glutIdleFunc(display);
    	glutReshapeFunc(reshape);
     
    	texture = loadBMP_custom("Directory\\image.bmp");
    	glutMainLoop();
    	return 0;
    }

    EDIT:
    i dont really need to open the BMP image, i just need to load it, draw on it and save it again.
    i've tried to open it at my program to make sure i've done the 1st phase correctly.
    Last edited by itayv94; 06-19-2017 at 10:49 PM.

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,411
    You're trying to draw a polygon on the Z=0 plane while using a perspective projection. Use an orthographic projection instead. Or if you must use a perspective projection, use appropriate vertex coordinates.

  3. #3
    Newbie Newbie
    Join Date
    Jun 2017
    Posts
    2
    Quote Originally Posted by GClements View Post
    You're trying to draw a polygon on the Z=0 plane while using a perspective projection. Use an orthographic projection instead. Or if you must use a perspective projection, use appropriate vertex coordinates.
    I really have no clue how to do it unfortunately.
    could you navigate me to the solution please ?
    P.S
    i dont really need to open the BMP image, i just need to load it, draw on it and save it again.
    i've tried to open it at my program to make sure i've done the 1st phase correctly.

  4. #4
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,411
    Change
    Code :
    	gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    to
    Code :
    	gluOrtho2D(0.0, 1024.0, 0.0, 512.0);

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •