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

Que compilador você usa? Ja instalou o open gl? Ta configurado corretamente?. Se não lembro mal precisava baixar o freeglut o algo assim. Si usar mingw(gcc) acho que o open gl ja vem junto, mas como falei, falta alguns arquivos, o freeglut por exemplo. Procure no google "instalar freeglut mingw" o algo pelo estilo.

adicionado 3 minutos depois

porém se não me engano, você pode abrir bmps com a biblioteca windows.h. Procure "abrir bmp windows.h". Se quiser continuar com a aventura de instalar o opengl e não conseguir, mais tarde lhe ajudo, agora tenho pressa e não posso mas certamente tenha outros usuários que possam lhe indicar algum tutorial, mas mesmo assim seria boa ideia facilitar informações comoo sistema operativo, compilador, etc.
Sorte.

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...