Ir ao conteúdo
  • Cadastre-se

C Como exibir uma imagem bitmap com opengl?


HenriSp
Ir à solução Resolvido por Benjamin Breeg,

Posts recomendados

Estou aprendendo opengl, mas com uma dificuldade tremenda. Preciso abrir uma imagem, mas não consegui encontrar nenhuma informação que me ajude

 

Eu tenho o seguinte código:


 

#include <GL/gl.h>
#include <GL/glut.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>


int channels = 3;           
unsigned char header[54];   
unsigned int dataPos;       
unsigned int width, height; 
unsigned int imageSize;     
unsigned char* data;        

int loadBMP( const char * imagepath){

    
    FILE * file = fopen(imagepath,"rb");
    if (!file){printf("Image could not be opened\n"); return 0;}

    if ( fread(header, 1, 54, file)!=54 ){ 
        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;
    }

    
    dataPos    = *(int*)&(header[0x0A]);
    imageSize  = *(int*)&(header[0x22]);
    width      = *(int*)&(header[0x12]);
    height     = *(int*)&(header[0x16]);

    
    if (imageSize==0)    imageSize=width*height*channels; 
    if (dataPos==0)      dataPos=54; 

    
    data = (unsigned char *)malloc(imageSize);

    
    fread(data,1,imageSize,file);

    int i;
    for(i = 0; i < width * height ; ++i){
     int index = i*3;
     unsigned char B,R;
     B = data[index];
     R = data[index+2];
     data[index] = R;
     data[index+2] = B;
    }

    
    fclose(file);

}

void init(void)
{
   
   glClearColor (0.0, 0.0, 0.0, 0.0);

}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   

   glRasterPos2i (0, 0);
   glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, data);

   glRasterPos2i (width, 0);
   glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, data);

   glFlush();
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho (0, w, 0, h, -1.0, 1.0);
   glMatrixMode(GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
   }
}

int main(int argc, char** argv)
{
   loadBMP(argv[1]);

   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(width*2, height);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(argv[0]);
   init();
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutDisplayFunc(display);
   glutMainLoop();
   return 0;
}

Eu preciso que exiba uma imagem bitmap nessa janela que é aberta, o problema é que eu não faço a mínima ideia do que é que eu tenho que incluir no código para que o programa exiba a imagem.

PS: Eu não posso incluir nenhuma outra biblioteca, e a imagem tem que estar no mesmo diretório do arquivo .c , ou seja eu não posso indicar o caminho direto da imagem, tipo: C:\\desktop\\...., tem que ser só, NomeDaImagem.bmp

 

Alguém pode me ajudar?

 

Link para o comentário
Compartilhar em outros sites

@vangodp

 

Obrigado por responder

 

Eu já estou usando a biblioteca windows.h, só esqueci de colocar quando botei o código no post.

 

Estou usando o codeblocks, com windows 7

o opengl tá configurado todo direitinho, compila normal e abre os programas normalmente.

 

Minha dúvida é de programação mesmo, não sei o que eu devo botar no código para que a imagem apareça na janela criada

 

Att.

Link para o comentário
Compartilhar em outros sites

Seu código esta funcionando corretamente, o windows.h é necessário porque ele que passa a estrutura do arquivo BMP pro render.

 

https://msdn.microsoft.com/pt-br/library/windows/desktop/dd183392(v=vs.85).aspx

 

Não use Glut, ele é muito antigo e desatualizado, seu uso é desencorajado ate pelos desenvolvedores do OpenGL:

 

https://www.khronos.org/opengl/wiki/Related_toolkits_and_APIs

 

Testei com o pacote compilado do site transmissionzero e esta ok.

 

https://www.transmissionzero.co.uk/software/freeglut-devel/

 

O que pode estar acontecendo ai se você usa CodeBlocks, é que ele não encontra o arquivo.bmp se você tentar executar diretamente pelo build and run, você tem que colocar a imagem no diretório do projeto mais especificamente \nomeprojeto\bin\debug e executar o arquivo a partir dessa pasta.

 

 

 

Link para o comentário
Compartilhar em outros sites

@Benjamin Breeg Obrigado por responder

 

Sim, o código está compilando, e eu incluí a biblioteca windows.h no código, só esqueci de colocar quando botei o código aqui no fórum. (Já atualizei). Eu tenho que usar Glut mesmo.

 

A imagem não abre porque eu não incluí nada no código para ela abrir, e o problema é esse, não sei o que eu tenho que incluir no código para que o programa exiba a imagem.

 

É dúvida de lógica de programação mesmo, pois não sei usar opengl ainda.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!