typedef struct image { int larg, haut, rgb; GLubyte *dat; GLubyte **pix; } *Image; /* Si on definit la variable : Image terre ; on chargera l'image de la terre avec l'instruction terre=LireImage("terre.ppm") ; terre->rgb est un booleen qui precise si un pixel est codé sur 3 ou 1 octet les dimensions de l'image seront terre->larg et terre->haut on accedera a un pixel (i,j) avec terre->pix[i][j] on accedera a la totalite de la matrice image avec terre->dat */ /* lecture d'une image PPM (rgb) ou PGM (niveaux de gris) */ #define MAXLIGNE 100 Image LireImage(char *nom) { int i, nbOctets; GLubyte *P; Image I; FILE *f; char s[MAXLIGNE]; int maxgrey; /* Ouverture du fichier */ f = fopen(nom, "r"); if (f == NULL) exit(0); /* confirmation du codage PPM ou PGM */ fgets(s, MAXLIGNE, f); if (s[0] != 'P' || ((s[1] != '6') && (s[1] != '5'))) { printf("erreur de format\n") ; exit(0); } I = (Image) malloc(sizeof(struct image)); if (s[1] == '6') { I->rgb=1; nbOctets=3;} else { I->rgb=0; nbOctets=1;} /* Lecture larg haut et allocation de l'image */ do fgets(s, MAXLIGNE, f) ; while (s[0] == '#') ; sscanf (s, "%d %d", &I->larg, &I->haut) ; P = I->dat = (GLubyte*) malloc(sizeof(GLubyte)*nbOctets*I->larg*I->haut); I->pix = (GLubyte**) malloc(sizeof(GLubyte*)*I->haut); for (i=0 ; ihaut ; i++) { I->pix[i] = P; P = P+nbOctets*I->larg; } /* Saut des commentaires et lecture de maxgrey */ do fgets(s, MAXLIGNE, f); while (s[0] == '#') ; /* Lecture de la matrice image */ fread(I->dat,sizeof(GLubyte)*nbOctets*I->larg*I->haut,1,f); fclose(f); return I; } /* restitution de l'espace memoire occupe par une image */ void restituerImage(Image I) { free(I->pix); free(I->dat); free(I); I=NULL; }