IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Chargement de texture jpeg


Sujet :

OpenGL

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Points : 163
    Points
    163
    Par défaut Chargement de texture jpeg
    Bonjour, j'ai repris un code trouvé sur ce site permettant de charger des textures à partir d'un jpeg. Ce code utilise la librairie libjpeg. Je l'ai juste adapté pour le mettre en c++ (avec une classe au lieu d'une structure). Tout compile parfaitement (bien que le compilo m'indique d'utiliser fopen peu ne pas être sécurisé). En revanche, quand je lance l'exe, un plantage à lieu au niveau de l'appel de la fonction jpeg_read_header(..) dans la méthode ReadJPEGFromFile

    J'utilise Visual C++ 2005 express :

    texture.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include <jpeglib.h>
    using namespace std;
    /* Microsoft Visual C++ */
    #ifdef _MSC_VER
    #pragma comment (lib, "libjpeg.lib")
    #endif	/* _MSC_VER */
     
    #include "h/texture.h"
     
    bool GlTexture_t::ReadJPEGFromFile (const char *filename)
    {
     
      FILE *fp = NULL;
      struct jpeg_decompress_struct cinfo;
      struct jpeg_error_mgr jerr;
      JSAMPROW j;
      int i;
     
      /* open image file */
      fp = fopen (filename, "rb");
      if (!fp)
        {
          fprintf (stderr, "error: couldn't open \"%s\"!\n", filename);
          return 1;
        }
     
     
     
      /* create and configure decompressor */
      jpeg_create_decompress (&cinfo);
      cinfo.err = jpeg_std_error (&jerr);
      jpeg_stdio_src (&cinfo, fp);
     
     
     
      /* read header and prepare for decompression */
    cerr<<"ici"<<endl;
      jpeg_read_header (&cinfo, TRUE);
     
      jpeg_start_decompress (&cinfo);
     
      /* initialize image's member variables */
      width = cinfo.image_width;
      height = cinfo.image_height;
      internalFormat = cinfo.num_components;
     
     
     
      if (cinfo.num_components == 1)
        format = GL_LUMINANCE;
      else
        format = GL_RGB;
     
      texels = new GLubyte [width * height * internalFormat];
     
      /* extract each scanline of the image */
      for (i = 0; i < height; ++i)
        {
          j = (texels +
    	((height - (i + 1)) * width * internalFormat));
          jpeg_read_scanlines (&cinfo, &j, 1);
        }
     
      /* finish decompression and release memory */
      jpeg_finish_decompress (&cinfo);
      jpeg_destroy_decompress (&cinfo);
     
      fclose (fp);
     
      return 0;
    }
     
    bool GlTexture_t::loadJPEGTexture (const char *filename)
    {
      GLuint tex_id = 0;
     
      ReadJPEGFromFile (filename);
     
      if (this && texels)
        {
          /* generate texture */
          glGenTextures (1, &id);
          glBindTexture (GL_TEXTURE_2D, id);
     
          /* setup some parameters for texture filters and mipmapping */
          glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
          glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
          /*
          glTexImage2D (GL_TEXTURE_2D, 0, jpeg_tex->internalFormat,
    		    jpeg_tex->width, jpeg_tex->height, 0, jpeg_tex->format,
    		    GL_UNSIGNED_BYTE, jpeg_tex->texels);
          */
     
          gluBuild2DMipmaps (GL_TEXTURE_2D, internalFormat,width, height, format, GL_UNSIGNED_BYTE, texels);
        }
     
      return true;
    }
    GLuint GlTexture_t::get_id()
    {
    	return id;
    }
    texture.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #ifndef TEXTURE_H
    #define TEXTURE_H
     
    #include <GL/glut.h>
     
    class GlTexture_t
    {
    	private :
     
    		GLsizei width;
    		GLsizei height;
     
    		GLenum format;
    		GLint internalFormat;
    		GLuint id;
     
    		GLubyte *texels;
     
    	public :
    		bool ReadJPEGFromFile (const char *);
    		bool loadJPEGTexture (const char *);
    		GLuint get_id();
     
    };
     
    #endif

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    J'ai tente de trouver la documentation de libjpeg mais en vain...

    Par contre, lorsque je regarde ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      /* create and configure decompressor */
      jpeg_create_decompress (&cinfo);
      cinfo.err = jpeg_std_error (&jerr);
      jpeg_stdio_src (&cinfo, fp);
    Il faudrait peut-etre mettre des tests autour de ces appels pour verifier que tout se passe correctement.

    Jc

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    En fait même si je récupère le retour ça crash à l'appelle de la fonction (donc avant le retour).

    Je pense que c'est la librairie que j'ai qui merdouille je vais essayer de me débrouiller autrement.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    plutot que de passer par la lib JPEG pourquoi n'essaye tu pas la lib DevIL qui te permet de sucroit de charger d'autres formats d'images et ceci bien plus facilement ??

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    Hum aucune idée

    J'ai utilisé libJpeg car c'était la librairie du tuto

    Dès que j'ai le temps je testerais l'autre.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    a mon humble avis, si tu passes a la lib DevIL ca va te liberer le temps d'eventuellement voir la lib JPEG (note , de memoire le format JPEG ne permet pas de gerer la transparence ... alors que d'autres formats comme PNG oui)

Discussions similaires

  1. EInvalidGraphic sur chargement d'un jpeg dans un TImage
    Par tomtom7 dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/02/2007, 12h54
  2. Chargement de texture sans "glaux" en pur Win32 ?
    Par Pragmateek dans le forum Windows
    Réponses: 10
    Dernier message: 08/09/2006, 18h26
  3. Chargement de Texture
    Par Glosialabolas dans le forum OpenGL
    Réponses: 5
    Dernier message: 27/01/2006, 16h40
  4. [FLASH MX] Chargement dynamique de Jpeg progressif
    Par Pierre-Yves VAROUX dans le forum Flash
    Réponses: 3
    Dernier message: 13/02/2005, 15h16
  5. chargement de texture avec la SDL
    Par Fry dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/05/2004, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo