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 :

linux: lecture d'une image bmp


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Par défaut linux: lecture d'une image bmp
    bonjour je travail sous linux, et depuis un moment, j'essaye de récuperer des informations sur une image bmp, mais apres le chargement de l'image, la largeur et la hauteur que j'ai ne sont pas les vrais largeur et hauteur de l'image.

    Voici les structures que j'utilise
    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
     
     
    // entete du fichier bitmap
     
    typedef struct {
     
    	// le type de fichier
     
    	unsigned char bfType[2];
    	// la taille en octect des données 
     
    	unsigned int bfSize;
    	// 0
     
    	unsigned short bfReserved1;
    	// 0
     
    	unsigned short bfReserved2;
    	// le premier octet des données
     
    	unsigned int bfOffBits;
     
     
     
    } bmp_file_header_t;
     
    // entete d'informations sur le fichier bitmap
     
    typedef struct {
     
    	// taille de la structure
     
    	unsigned int biSize;
    	// largeur en px
    	int biWidth;
    	// hauteur en px (peut être négatif attention)
     
    	int biHeight;
    	// 1
     
    	unsigned short biPlanes;
    	// nombre de bits par pixel
     
    	unsigned short biBitCount;
    	// type de compression
    	unsigned int biCompression;
    	// taille de l'image en octet
    	unsigned int biSizeImage;
    	// pixels par metre sur l'axe x
     
    	int biXPelsPerMeter;
    	// pixels par metre sur l'axe y
     
    	int biYPelsPerMeter;
    	// nmmbre de couleurs utilisées
     
    	unsigned int biClrUsed;
    	// nombre de couleurs importantes
     
    	unsigned int biClrImportant;
     
     
     
    } bmp_info_header_t;
    Voici mon code
    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
     
     
    	FILE* fp;
    	bmp_file_header_t bmfh;
     
    	bmp_info_header_t bmih;
    	// pointeur vers le premier pixel de l'image
    	// compri entre 0 et 255
    	unsigned char* bitmapImage;
     
    	// ouverture du fichier en lecture binaire
    	fp = fopen( filename, "rb" );
    	// si l'ouverture a echoue
    	if( ! fp ) {
    		fprintf( stderr, "error: ne peux pas ouvrir \"%s\"!\n", filename );
     
    		return NULL;
     
    	}
     
    	fread( &bmfh, sizeof( bmp_file_header_t ), 1, fp );
     
    	if( strncmp( ( char* ) bmfh.bfType, "BM", 2 ) != 0 ) {
     
    		fprintf( stderr, "%s n'est pas un fichier bmp valide!\n", filename );
     
    		fclose( fp );
     
    		return NULL;
     
    	}
     
    	fread( &bmih, sizeof( bmp_info_header_t ), 1, fp );
    	std::cout << "biCompression[ " << bmih.biCompression << " ]\n";
    	std::cout << "biSizeImage[ " << bmih.biSizeImage << " ]\n";
    	std::cout << "biWidth[ " << bmih.biWidth << " ]\n";
    	std::cout << "biHeight[ " << bmih.biHeight << " ]\n";
    	fread( bitmapImage, 1, bmih.biSizeImage, fp );
    L'image a une hauteur et une largeur de 196, et voici le resultat que j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    biCompression[ 0 ]
    biSizeImage[ 185729024 ]
    biWidth[ 12845056 ]
    biHeight[ 65536 ]
    Merci de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 39
    Par défaut
    Vu que tu as posté dans la partie OpenGL, cette partie du tutoriel sur les textures de NeHe semble correspondre à ton souci :

    Avant de commencer à expliquer le code, il y a quelques petites choses importantes que vous devez savoir sur les images que vous prévoyez d'utiliser comme textures. La hauteur et la largeur de l'image doivent être une puissance de deux. La largeur et la hauteur doivent être d'au moins 64 pixels, et pour des raisons de compatibilité, ne devraient pas être plus grandes que 256 pixels. Si l'image que vous voulez utiliser n'a pas 64, 128 ou 256 pixels en hauteur et en largeur, redimensionnez-la avec un programme de retouche d'image. Il existe des moyens pour contourner cette limitation, mais pour le moment nous nous collerons seulement aux tailles de texture standards.

    Quand j'ai travaillé sur ce tutoriel, après avoir épluché le code proposé, j'ai varié les expériences en utilisant d'autres images qui allaient me servir dans l'application comme texture.

    Et j'ai tenté de charger des images ne répondant pas au spécification citée ci-dessus. J'ai eu les mêmes effets que tu sembles rencontrer.

    Pour le résoudre, j'ai redimensionné avec PSP8 (mais cela peut être autre logiciel de dessin) mes images pour qu'elles soient au norme précisée plus haut. Et je n'ai plus eu le souci.

    Si cela venait de là, merci de le confirmer. Et si c'est une autre solution, idem.


  3. #3
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fread( &bmfh, sizeof( bmp_file_header_t ), 1, fp );
    ATTENTION !!! tu peut avoir des problèmes si la taille de tes structures est aligné en memoire (mais pas dans le fichier).
    au lieu de faire ca, tu devrais plutôt charger chaque membre de ta structure un par un...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture d'une image bmp
    Par Pinokio3x7 dans le forum C
    Réponses: 6
    Dernier message: 24/04/2010, 14h04
  2. lecture entête d'une image.bmp
    Par josh51 dans le forum C
    Réponses: 2
    Dernier message: 15/10/2009, 17h17
  3. inserer une image BMP dans un fichier rtf
    Par Alice9 dans le forum MFC
    Réponses: 17
    Dernier message: 06/07/2004, 10h31
  4. [BPW] Impression d'une image BMP
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 21/08/2003, 14h34
  5. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01

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