Jump to content

Mostrar imagens em C


FCorvelo

Recommended Posts

Boas! 🙂

Alguém sabe uma forma simples de mostrar imagens (de preferência no formato JPEG) numa "Consol Application"? Algo do género: escrevia a localização da imagem no programa e ela abria uma janela gráfica e mostrava a imagem nessa janela.

Já tentei algumas bibliotecas que encontrei na Internet, mas pareceram-me muito complicadas para aquilo que eu quero. E alem disso não as consegui meter a funcionar :/

Obrigado desde já 😉

Link to comment
Share on other sites

allegro fica muito facil para fazer algo assim do genero, acho que na wiki tem um exemplo desses 🙂

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

SDL

http://www.libsdl.org/

para poderes abrir uma imagem em jpeg, terás de usar também a extensão SDL_image

http://www.libsdl.org/projects/SDL_image/

#include <stdlib.h>
#include <stdio.h>

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_opengl.h>

int main(int argc, char ** argv)
{
 /* variaveis */
 SDL_Surface * window = NULL, * image = NULL;
 SDL_Event event;
 int run = 1;

 /* iniciar SDL */
 if (SDL_Init(SDL_INIT_VIDEO) != 0)
 {
   fprintf(stderr, "Erro a inicializar o SDL : %s\n", SDL_GetError());
   return -1;
 }
 atexit(SDL_Quit);

 /* iniciar SDL_image */
 if (IMG_Init(IMG_INIT_JPG) == 0)
 {
   fprintf(stderr, "Nao foi possivel inicializar o SDL_imagem para abrir ficheiros jpeg\n");
   fprintf(stderr, "verifique se os dll's necessarios se encontram acessiveis\n");
   exit(-3);
 }

 /* ler imagem do ficheiro */
 if ((image = IMG_Load("imagem.jpg")) == NULL)
 {
   fprintf(stderr, "Nao foi possivel abrir o ficheiro jpeg %s\n", IMG_GetError());
   exit(-4);
 }

 /* criar janela (cuidado com o tamanho ) */
 if ((window = SDL_SetVideoMode(image->w, image->h, 32, 0)) == NULL)
 {
   fprintf(stderr, "Erro a inicializar a janela : %s\n", SDL_GetError());
   exit(-2);
 }

 /* enviar a imagem para o buffer de apresentação */
 SDL_BlitSurface(image, NULL, window, NULL);
 SDL_Flip(window);

 /* ciclo de vida da aplicação */
 while (run)
 {
   /* ler eventos do SDL */
   while (SDL_PollEvent(&event))
   {
     /* se for evento de fechar a janela então terminar a aplicação */
     if (event.type == SDL_QUIT)
       run = 0;
   }

 }  

 /* libertar a memória da imagem (não é necessário para a janela) */
 SDL_FreeSurface(image);

 /* limpeza do SDL_image e SDL */
 IMG_Quit();
 SDL_Quit();

 return 0;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Obrigado pelas respostas 🙂

Eu tenho alguma dificuldade em utilizar bibliotecas (talvez porque nunca aprendi realmente como funcionam). Será que me podiam explicar ou então indicar algum tutorial?

Eu só sei utilizar aquelas que têm um ficheiro .lib. As outras acho que é preciso compilar, mas ainda não consegui encontrar informação concreta sobre isso :/

Link to comment
Share on other sites

Já consegui 😄

Mas há um problema. Nesse código que me deste como exemplo, o while que fica à espera do evento de fechar a janela fica a consumir muito processador. Então pensei em fazer um sleep de alguns segundos só para manter a janela aberta com a imagem, mas com o sleep aos fim de poucos segundos o programa deixa de responder.

Sabes o que poderá ser? Também experimentei com a função SDL_Delay e faz o mesmo :/

Link to comment
Share on other sites

sim ... o SDL foi feito para programas multimédia.

existe eventos mas não é feito em C o que não é uma linguagem orientada a eventos, logo terás sempre o processador a correr.

o que podes fazer é sim usar o SDL_Delay como disseste.

ficaria algo deste genero:

 /* ciclo de vida da aplicação */
 while (run)
 {
   /* ler eventos do SDL */
   while (SDL_PollEvent(&event))
   {
     /* se for evento de fechar a janela então terminar a aplicação */
     if (event.type == SDL_QUIT)
       run = 0;
   }

   /* esperar meio segundo em cada frame */
   SDL_Delay(500);
 }
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.