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 :

[débutant] problème de lecture d'image


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut [débutant] problème de lecture d'image
    bonjour à tous,
    j'ai la fonction de lecture de bmp suivante :

    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
    struct ImageBMP LoadBMP(char *File)
    {
    	unsigned char	*Data;
    	FILE			*fichier;
     
    	unsigned char	Header[0x36];
    	GLuint			DataPos,DataSize;
    	GLsizei			Width,Height;
    	struct ImageBMP Resultat ;
     
        // Lit le fichier et son header
    	fichier = fopen(File,"rb");
        if (!fichier) {
           return Resultat ;
        }
    	if (fread(Header,1,0x36,fichier)!=0x36) EXIT;
    	if (Header[0]!='B' || Header[1]!='M')	EXIT;
    	if (CTOI(Header[0x1E])!=0)				EXIT;
    	if (CTOI(Header[0x1C])!=24)				EXIT;
     
        // Récupère les infos du fichier
    	DataPos			= CTOI(Header[0x0A]);
    	DataSize		= CTOI(Header[0x22]);
        // Récupère les infos de l'image
    	Width			= CTOI(Header[0x12]);
    	Height			= CTOI(Header[0x16]);	
     
        // Charge l'image
    	fseek(fichier,DataPos,0);
    	Data = new unsigned char[DataSize];   //    ***********  c'est là
    	//Data = (unsigned char*) malloc((DataSize+1)* sizeof(char));  //remplacement non fructueux
     
        if (!Data) EXIT;
     
    	if (fread(Data,1,DataSize,fichier)!=DataSize) 
    	{
    		delete Data;  // *********** et c'est aussi là
    		//free(Data);  // remplacement non fructueux
    		fclose(fichier);
    		return Resultat ;
    	}
     
    	fclose(fichier);
     
        // Inverse R et B
    	unsigned char t;
    	int x;
        for (x=0;x<Width*Height;x++) 
    	{
    		t=Data[x*3];
    		Data[x*3]=Data[x*3+2];
    		Data[x*3+2]=t;
    	}
     
        // On prépare l'ImageBMP à renvoyer
        Resultat.imagebytes = Data ;
        Resultat.hauteur = Height ;
        Resultat.largeur = Width ;
     
    	return Resultat ;
    }
    pour info,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct ImageBMP{
       unsigned char *imagebytes ;
       GLsizei hauteur,largeur;
    };
    j'ai déniché ce code sur internet et la compilation ne se passe pas comme il faudrait :
    il me dit que "new" et "delete" n'ont pas été déclarés. jusque là, je veux bien.

    ne sachant pas trop bien à quoi servent ces deux instructions, j'ai tenté de les remplacer par des instructions acceptées (du moins, qui compilent), mais je ne dois pas avoir eu les bonnes intuitions. (repérées par les **** ) car le résultat est qu'il ne me lit aucune donnée. avouez que c'est pas cool.

    pourriez-vous me dire comment corriger ce code pour que la lecture se fasse correctement ?

    merci

  2. #2
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    new et delete sont des operateurs de base du language C++ et donc à moins que ton compilateur soit uniquement "language C" (ce que je doute) , tu as du mettre C dans les options de ton projet alors que tu aurai du choisir C++.
    Ensuite c'est bizzard que tu puisse pas changer par un malloc, mais y a peut-être une petite erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Data = (unsigned char*) malloc((DataSize+1)* sizeof(char));
    essaye ça a la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Data = (unsigned char*) malloc((DataSize+1)* sizeof(unsigned char));
    car unsigned char c'est codé 4 octets et char sur 8 octets

    +

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    en effet, tu as raison, ça marche mieux en mettant le compilateur en mode c++.

    mais, le prog ne marche pas pour autant mieux

    j'ai décortiqué la fonction et c'est là que ça coince :
    il rentre dans le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (fread(Data,1,DataSize,fichier)!=DataSize)
       {
          delete Data;  
          fclose(fichier);
          return Resultat ;
       }
    ce qui signifie que la lecture ne s'est pas faite comme il faut.
    il doit y avoir un autre problème bien caché dans la fonction, mais je vois vraiment pas où.
    personne n'a d'idée ??

    juste un truc : char et unsigned char sont codés tous les deux sur un octet.
    char va de -128 à 127 et unsigned char va de 0 à 255.

  4. #4
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    le mieux est que je te file le code de mon loader, c'est quasi le même sauf C++ :

    le .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
     
     
    #include "loadbmp.h"
     
     
     
    ///////----charge les Bmp(non?)----//////
     
    bool Bmp::load(char File[])
    {
     
    	FILE			*fich;
    	unsigned char	Header[0x36];
    	unsigned int	DataPos,DataSize;
     
     
     
    	//Lit le fichier et son header
    	fich = fopen(File,"rb");
    	if (!fich)
    	{
    		printf("###Fichier introuvable : %s \n",File);
    		return false;
    	}
     
     
     
    	if (fread(Header,1,0x36,fich)!=0x36)
    	{
    		printf("###L'entête du fichier Bmp n'est pas correcte ! \n");
    		fclose(fich);
    		return false;
    	}
     	if (Header[0]!='B' || Header[1]!='M')
    	{
    		printf("###Le format n'est pas Bmp !\n");
    		fclose(fich);
    		return false;
    	}
    	if (CTOI(Header[0x1E])!=0)
    	{
    		printf("###Format non supporte !\n");
    		fclose(fich);
    		return false;
    	}
    	if (CTOI(Header[0x1C])==24)
    	{
    	  printf("\tBmp format 24bits RGB");
    	  Components = 3;		
    	}
    	else
    	{
    	  printf("###Format non supporte !\n");
    		fclose(fich);
    		return false;
    	}
     
     
     
    	//Récupère les infos du fichier
    	DataPos			= CTOI(Header[0x0A]);
    	DataSize		= CTOI(Header[0x22]);
    	//Récupère les infos de l'image
    	Width			= CTOI(Header[0x12]);
    	Height			= CTOI(Header[0x16]);	
     
     	//!!!!
    	if (DataSize==0) DataSize= Width * Height * Components;
    	if (DataPos==0)  DataPos=0x36;
     
    	//Charge l'image
    	fseek(fich,DataPos,0);
    	Data = new unsigned char[DataSize];
    	printf("\tRes:%d\n",Width);
    	if (!Data) EXIT;
     
    	if (fread(Data,1,DataSize,fich)!=DataSize) 
    	{
    		delete Data;
    		fclose(fich);
    		return false;
    	}
     
    	fclose(fich);
     
     
    	invert_RB();
    	//Envoie la texture à OpenGL
    	return true;
     
    }
    /////////////////////////////////////
    void Bmp::invert_RB()
    {
    	//Inverse R et B
    	unsigned char t;
    	for (int x=0;x<Width * Height;x++) 
    	{
    		t=Data[x*3];
    		Data[x*3]=Data[x*3+2];
    		Data[x*3+2]=t;
    	}
    }

    et le .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
     
     
    #ifndef _LOAD_BMP_H_
    #define _LOAD_BMP_H_
     
    #include <stdio.h>
     
     
    #define CTOI(C)   (*(int*)&C)  	//récupère en int un nombre pointé par un char*
    #define EXIT { printf("Erreur pendant chargement du fichier %s\n",File);fclose(fich);return false;}
     
    class Bmp
    {
    public:
    	int   Components;
    	int   Width,Height;
     	unsigned char *Data;
     
    	void invert_RB();
    	bool load(char *File);
     
    };
     
    #endif

    +

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    ton code m'a l'air très intéressant :

    une question : à quoi sert la fonction invert ?
    - à inverser les couleurs

    oui, mais d'un point de vue pratique, qu'apporte-t-elle ?

  6. #6
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    les couleurs ne sont pas données dans le même ordre dans un fichier .bmp (BGR : Blue-Green-Red) que les fonctions OpenGL qui les prend en RGB (Red-Green-Blue).
    La fonction invert_RB() de la classe Bmp aurait pu être ici incluse dans la fonction load(char file[]).
    De toute façon, elle est appelée à la fin du chargement du fichier Bmp.
    Tu as donc juste à faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Bmp image_bmp;
    image_bmp.load("fichier.bmp");
    comme tu as pu le voir, mon code et le tiens proviennent de la même source, je l'ai juste un peu modifié pour qu'il "colle" plus à mon programme.

    +

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    merci de ces éclaircissements.

    je souhaite aussi pouvoir analyser les pixels de mon image un par un.
    j'ai donc rajouté dans ta fonction un affichage du contenu de Data et là, c'est pas top :

    j'ai une image test 1x2x24bits les deux pixels sont les suivants : (151,152,153) et (201,202,203) et l'affichage de Data me donne
    {201, 202, 203, 152, 153, 0, 151, 0} (j'ai fait une boucle qui m'affiche les DataSize premiers éléments de Data)

    tous les nombres sont là, mais bon ... coment dois-je interprêter ces valeurs pour repérer les pixels avec chacune de leurs composantes ?

  8. #8
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    tu peu me donner ta fonction STP ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    la fonction que j'utilise est celle que tu m'as indiquée, j'ai juste rajouté avant le dernier "return true" le code suivant
    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
    extern texture[];                           // rappel du tableau global
       glGenTextures(1,&texture[nb]);              // assignation d'un id pour la texture 
       glBindTexture(GL_TEXTURE_2D,texture[nb]);   // sélection de la texture
     
       glTexImage2D (
    	            GL_TEXTURE_2D, 	    //Type : texture 2D
                    0, 	                //Mipmap : aucun
                    3, 	                //Composantes
                    largeur, 	        //Largeur
                    hauteur, 	        //Hauteur 
                    0, 	                //Largeur du bord
                    GL_RGB,  	        //Format : RGB
                    GL_UNSIGNED_BYTE, 	//Type des couleurs
                    Data 	            //Addresse de l'image
                     );            
     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
     
       extern FILE *fichier_log;
       unsigned int i;
       for (i=0; i<DataSize; i++)
          fprintf(fichier_log, "%d\n", Data[i]);
    texture[] étant un tableau global contenant les id de mes textures.
    nb étant un int que j'ai rajouté en paramètre à la fonction loadbmp
    j'ai préféré procéder comme ça pour pouvoir charger toute mes textures au lancement et n'avoir plus qu'à les rappeler en faisant

    glBindTexture(GL_TEXTURE_2D,texture[nb]);

    et c'est donc dans le fichier_log que je récupère ma liste de nombres dont la séquence m'échappe.

  10. #10
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    tu lui demande d'afficher un int ("%d") alors que data est un unsigned char, essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(fichier_log, "%s\n", Data[i]);
    ou alors, si tu veu vraiment un int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(fichier_log, "%d\n", atoi(Data[i]));
    atoi est dans stdlib.h

    voit deja si tu as le même resultat avec ça.

    +

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Data est un tableau de unsigned char donc de nombres non signés allant de 0 à 255. l'affichage des valeurs numériques se fait donc avec %d ou %u

    ce n'est pas dans l'affichage du tableau que le problème se pose, c'est dans le contenu même du tableau.

    j'ai fait l'essai en prenant une image 2x1x24bits et là, ça marche impeccable, j'obtiens tous mes pixels dans l'ordre. j'ai donc essayé ensuite avec une image 2x2x24bits et là, resurprise :

    mon image de départ est
    première ligne : (151,152,153) (154,155,156)
    deuxième ligne: (201,202,203) (204,205,206)

    et j'obtiens dans mon fichier de sortie
    201,202, 203,204,205,206
    153,0,0, 156,151,152,
    155,154,0, 0
    encore une fois, tous les nombre y sont mais pas dans le bon ordre.

    la texture affichée par glut correspond bien aux couleurs décrites dans ce fichier.

    j'ai aussi essayé avec l'option glPixelStorei(GL_UNPACK_ALIGNMENT,1); mais ce n'est que la représentation de ma texture qui est changée, le tableau reste inchangé (et toujours aussi faux)

    franchement, je ne vis pas d'où ça peut venir.

  12. #12
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    aucune idée, c'est vrai qu'OpenGL ce sert de l'image comme texture sans probléme, je ne comprend pas ton probléme de tableau, je vais voir ça de plus pret moi même et je te tiens au courant

    +

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    je crois que le chmilblick (ou chimilimili) avance, j'ai réécrit la fonction de chargement d'image et ça fonctionne déjà mieux :
    je n'ai changé que la partie de lecture dans le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned int nb_octets_lus=0;
    unsigned int i;
    unsigned char temp[2];
    for (i=0; i<hauteur; i++)
       {     
           fread(Data+nb_octets_lus, Components*largeur ,1, fich);
           nb_octets_lus+=3*largeur;
     
           fread(temp, 2,1, fich);  // marqueur de changement de ligne
       }        
     
    fclose(fich);
    le problème venait des deux octets qui symbolisent la fin de chaque ligne, qui ne doivent pas être pris en compte pour la génération du tableau de unsigned char. ainsi, Data contient bien toutes les composantes des couleurs dans l'ordre sans aucun marqueur de changement de ligne. opengl se débrouille avec tout ça.

    alala, ces deux petits octets étaient bien cachés !

  14. #14
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    ah ça m'interesse , comment sait tu combien d'octets sur chaque ligne ??

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    nombre d'octets sur chaque ligne = largeur * nombre de composantes pour chaque pixel. 24 bits -> 3 composantes

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    euh, finalement, il faut ajouter un truc à la fonction pour qu'elle marche encore mieux : la lecture doit se faire de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      unsigned int i;
       unsigned char temp[largeur];
       for (i=0; i<hauteur; i++)
          {     
              fread(Data+(hauteur-i-1)*(largeur*Components), Components*largeur ,1, fich);
     
              fread(temp, largeur,1, fich);  // marqueur de changement de ligne
          }    
     Data[Components * largeur * hauteur]='\0';
    en effet, ce ne sont pas deux octets qui trainent à la fin, c'est largeur octets. et je pense d'ailleurs qu'il s'agit du quatrième octet qui aurait été utilisé en mode 32 bits. aussi, les lignes de l'image dont rangées dans l'ordre inverse.

  17. #17
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 787
    Points
    1 787
    Par défaut
    Ok merci, ça pourra me servir tout ça
    +

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

Discussions similaires

  1. [IRM]problème de lecture d'image analyze
    Par larimoise dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/06/2008, 09h37
  2. Problème de lecture d'image 2D avec Inventor/coin3D
    Par wafa_b dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 25/04/2008, 15h12
  3. [Débutant] problème de preload avec image
    Par arnofly dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 12/02/2008, 19h48
  4. [Débutant] Problème de lecture au clavier
    Par -papinou- dans le forum Pascal
    Réponses: 5
    Dernier message: 06/02/2008, 16h23
  5. Réponses: 7
    Dernier message: 13/03/2007, 11h20

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